Які відмінності між файлами Linux і Windows .txt (кодування Unicode)


16

Я використовую лише набір 128 символів, визначений у вихідному стандарті ANSI.

Але в цілому як файли імпліментовані по-різному.

Я не переймаюся дисплеєм, тобто якщо відображається вкладка з 6 або 8 символами, але власне внутрішнє представлення в пам'яті

Я чула одну відмінність - використання \ r \ n (Windows) проти \ n для припинення рядків (Linux).


Я думаю, що байт порядку вбивства вбиває мій #! (Перший рядок) у моїх PHP-файлах, які я переніс із Windows на Linux. Весь файл працює, але він не може знайти перекладача як слід. Якщо я спеціально переконуюсь, що потрібно кодувати в ANSI, вибравши метод кодування в блокноті, це правда ASCII чи робить Windows щось інше

Подивіться, чи є у вас поле Gnu / Linux. Він є частиною Debian (і, принаймні, деяких інших), але може потребувати встановлення. Це потрібно, оскільки Microsoft помилково додає BOM до початку файлів utf-8.
ctrl-alt-delor

Відповіді:


17

"Unicode" в Windows - UTF-16LE, і кожен символ - 2 або 4 байти. Linux використовує UTF-8, і кожен символ знаходиться в межах від 1 до 4 байтів.

"Абсолютний мінімум, кожен розробник програмного забезпечення повинен абсолютно, позитивно знати про набори Unicode та символів (без виправдань!")


Windows витрачає байт?

1
Якщо ви нічого не використовуєте за межами Latin-1, так.
Ігнасіо Васкес-Абрамс

Вони є у статті, до якої я пов’язаний.
Ігнасіо Васкес-Абрамс

1
Провів пошук за UTF-16LE, але не знайшов його у статті.

1
Переважно. Вам також потрібно порахувати BOM, якщо він присутній.
Ігнасіо Васкес-Абрамс

11

Розриви рядків

Windows використовує закінчення рядків CRLF ( \r\n, 0D 0A), а Unix просто використовує LF ( \n, 0A).

Кодування символів

Більшість сучасних (тобто з 2004 року або більше) Unix-подібних систем роблять UTF-8 кодуванням символів за замовчуванням.

Однак Windows не має вбудованої підтримки UTF-8. Він внутрішньо працює в UTF-16 і передбачає, що charрядки-на основі перебувають у застарілій кодовій сторінці . На щастя, Блокнот здатний читати файли UTF-8; на жаль, кодування "ANSI" як і раніше за замовчуванням.

Проблемні спеціальні персонажі

U + 001A ЗАДАЧА

Windows (рідко) використовує Ctrl+ Zяк символ кінця файлу. Наприклад, якщо ви typeстворюєте файл у командному рядку, він буде усічений у першому 1Aбайті.

У Unix Ctrl+ Zнічого особливого.

U + FEFF ZERO З ПРОСТО НЕРАБОТИМ ПРОСТОРОМ (байт-замовлення)

У Windows файли UTF-8 часто починаються з "позначки порядку байти", EF BB BFщоб відрізнити їх від файлів ANSI.

У Linux BOM не відсторонено, оскільки він розбиває такі речі, як рядки shebang у скриптах оболонки. Крім того, було б безглуздо мати підпис UTF-8, коли UTF-8 - це кодування за замовчуванням.


1
Ctrl-Z працює у Windows так само, як Ctrl-D (або будь-який символ, з яким ви пов'язані EOF stty) в Linux: драйвер консолі переводить його в кінець файлу. Буквальний символ не відображається у вхідному потоці; це просто змушує читати () повернути 0.
psusi

Я думаю, що байт порядку вбивства вбиває мій #! (Перший рядок) у моїх PHP-файлах, які я переніс із Windows на Linux. Весь файл працює, але він не може знайти перекладача як слід. Якщо я спеціально переконуюсь, що кодувати в ANSI, вибравши метод кодування в блокноті, це правда ASCII чи Windows робить щось інше?

1
Варто зазначити, що псевдо-термін "кодова сторінка ANSI", хоча все ще з'являється в таких програмах, як "Блокнот", є цілком помилковим явищем, і Microsoft це визнало давно. Для детальної інформації див. Сторінку en.wikipedia.org/wiki/Windows_code_page .
Incnis Mrsi

У utf-8 немає BOM, але MS-Windows вставляє його. Зробити це неправдивим utf-8. Одне з правил utf-8 полягає в тому, що будь-який файл, який може бути представлений в ascii, є бітовим для бітових ідентичних у utf-8. Також ви можете почати читати utf-8 в будь-якій точці потоку.
ctrl-alt-delor

3

Я чула одну відмінність - використання \ r \ n (Windows) проти \ n для розривів рядків (Linux).

Так. Більшість текстових редакторів UNIX справляться з цим автоматично, редактори програмістів Windows можуть з цим впоратися, загальні текстові редактори (базовий Блокнот) не будуть.

Здається, Windows також потребує EOF (Ctrl-Z) як END OF FILE в деяких контекстах, тоді як ви, ймовірно, ніколи не побачите його в UNIX.

Пам'ятайте, що MacOS X зараз UNIX під ним, тому він використовує закінчення рядків UNIX. Хоча до OS X (MacOS 9 і вище) він мав своє закінчення (\ r)

EDIT: в іншому форматі CR та LF:

  • \ n - ASCII 0x0A, подача рядків (LF)
  • \ AS ASCII 0x0D, повернення каретки (CR)

Де \ r \ n та \ n у наборі символів ASCII? en.wikipedia.org/wiki/File:ASCII_Code_Chart.svg

2
@Chris \ n - ASCII 0x0A, канал каналів. \ n ASCII 0x0D, повернення перевезення
Rich Homolka

@Rich Що про EOF? Це персонаж ANSI?

2
@barlop, термінал переводить натискання клавіші (це звичайно ctrl-d в системах Unix) в EOF, якщо цей ключ управління не було вимкнено. Програма читає EOF, а не фактичний ключ, який ви натиснули. Тобто read()повертає нульові байти замість будь-якого конкретного символу.
psusi

1
@barlop, це я вже говорив: це не повертає жодного символу. read () повертає кількість байтів, збережених у вашому буфері. У EOF ​​він просто дає нульові байти. Це сигнал, що ви дійшли до кінця файлу, і що читати більше нічого немає.
psusi

1

Яке кодування Unicode використовується не на основі ОС.

Навіть у Windows notepad.exe є перелічені параметри (я вкладу в дужки, що означає блокнот під цим) ANSI (не unicode), Unicode (блокнот означає Unicode LE), Unicode Big Endian (BE), UTF-8

ANSI не є unicode, він включає в себе дуже обмежену кількість символів, тому давайте відкладемо це.

Але дивіться, що навіть блокнот може робити LE, або BE, або UTF-8

А блокнот убік, UTF-8 може бути з BOM або без нього.

І я використовую Windows із Cygwin, хоча порти Windows цілком можуть робити \ r \ n навіть коли ви вказуєте \ n Бачили sed, що робить це.

Не існує жодного правила того, для чого використовується Unicode, що кодує конкретну ОС. Це не була б дуже гнучка ОС, якби вона була.

Щоб дійсно побачити відмінності, знайте Програмне забезпечення, що кодує частина програмного забезпечення, яке використовується або пропонує.

Отримайте Cygwin та xxd та / або шестнадцятковий редактор і подивіться, що насправді знаходиться у файлі. Використовуйте команду "файл", щоб допомогти визначити файл. Тоді ви фактично бачите, що таке UTF 16bit LE. Що таке UTF 16bit BE. Що таке UTF-8 (а UTF-8 може бути з BOM або без нього).

Іноді ви можете сказати блокноту зберегти як unicode (під яким блокнот означає unicode 16 біт-маленький ендіан), і він не буде. Але виберіть шрифт unicode, як-от arial unicode, і скопіюйте у charmap кілька символів unicode, і це буде. І хороший спосіб переконатися, що блокнот чи будь-яке програмне забезпечення роблять, - переглянувши шістнадцятковий файл

C:\asdf>notepad.exe a.a

C:\asdf>file a.a
a.a; Little-endian UTF-16 Unicode text, with no line terminators

C:\asdf>type a.a
aaa慡ൡ <-- though displayed aaa followed by some boxes in my cmd window
C:\asdf>

C:\asdf>xxd a.a
0000000: fffe 6100 6100 6100 6161 610d            ..a.a.a.aaa.

C:\asdf>

^^ The portion of the byte that stores the 61 is the lower value portion which with LE is stored first.

Команда dd (команда * nix, яку я запускаю від cygwin в межах Windows), може перемикати її

C:\asdf>xxd -p a.a
fffe6100610061006161610d

C:\asdf>file a.a
a.a; Little-endian UTF-16 Unicode text, with no line terminators

C:\asdf>dd if=a.a conv=swab of=a.a2
0+1 records in
0+1 records out
12 bytes (12 B) copied, 0 seconds, Infinity B/s

C:\asdf>type a.a2
a  a a aaa
C:\asdf>xxd -p a.a2
feff00610061006161610d61

C:\asdf>file a.a2
a.a2; Big-endian UTF-16 Unicode text, with no line terminators

C:\asdf>

А сам блокнот може зберігати як UTF-16 Big Endian або UTF-16 Little Endian або UTF-8

введіть тут опис зображення

Якщо ви технічна особа чи навіть просто користувач блокнота, ви не зобов'язані кодувати одне через вашу ОС!

Я вважаю, що UTF-8 має більше сенсу, ніж UTF-16, UTF-16 використовує 16 біт навіть для символів, яким потрібно лише 8 біт. Однак майте на увазі, що в charmap показано код UTF-16.

Піднесене (редактор тексту Windows) зберігає unicode як UTF-8 за замовчуванням.

Я використовую Windows, а іноді і unicode, і я в основному використовую UTF-8.

А оскільки Windows є технічно гнучким, Linux є принаймні настільки ж технічно гнучким!


Ви написали команди fileта typeвсередині запиту Cygwin?
Весног

xxdа typeв стандартній установці Cygwin я вважаю, що команди відсутні. Крім того, я хочу відтворити ваші результати.
Весног

1
@Vesnog type- це стандартна команда, вбудована в cmd.exe xxd, швидше за все, не встановлена ​​за допомогою замовчування cygwin, але коли ви встановлюєте cygwin або після нього, якщо ви запускаєте налаштування cygwin, ви отримуєте довгий список команд, які можна встановити для використання в cygwin, і просто введіть xxd у вікно пошуку налаштувань cygwin, і воно з’явиться. xxd також доступний після встановлення vim7, щоб ви могли його отримати і там.
барлоп

1
@Vesnog ви можете запускати команди cygwin всередині cygwin або зовні cygwin. Якщо ви запускаєте їх за межами cygwin, тоді додайте c:\cygwin\bin(якщо саме тут є підкаталог біна cygwin) у свій шлях. Також будь-яка внутрішня команда cmd на зразок 'type' або 'dir', або будь-яка зовнішня exe, наприклад calc.exe (калькулятор windows), можна запускати / запускати з cygwin. Практично все, що можна запустити від cygwin, можна запустити з cmd і навпаки. Якщо ви хотіли використовувати bash, тоді використовуйте cygwin, і якщо ви зіткнулися з проблемами з одинарними проти подвійних лапок, тоді виконайте команди cygwin в межах cygwin та cmd в межах cmd.
барлоп

1
@Vesnog xxd теж може записати файл, наприклад, echo 61|xxd -r -p>a.aспробуйте, type a.a тож ви можете фактично отримати байт-дамп із xxd -p, переставити або змінити байти, а потім подати його в xxd -r -p та отримати новий інший файл з іншим кодуванням або різні дані на основі старих даних. Команда "файл" з'ясовує кодування на основі байтів.
барлоп

-1

Linux використовує UTF-8, і кожен символ знаходиться в межах від 1 до 6 байтів, а не між 1 і 4 байтами.

U00000000 - U0000007F: 0xxxxxxx
U00000080 - U000007FF: 110xxxxx 10xxxxxx
U00000800 - U0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U00010000 - U001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U00200000 - U03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U04000000 - U7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

Про це вже було сказано у відповіді, поданій у 2011 р.
Рамхаунд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.