Каковы различия между файлами .txt Linux и Windows (кодировка Unicode)

16

Я использую только 128 символов, определенных в оригинальном стандарте ANSI.

Но в целом, как файлы создаются по-разному.

Меня не интересует отображение, т.е. если отображается вкладка с 6 или 8 символами, но фактическим внутренним представлением в памяти

Одно из отличий, которое я слышал, это использование \ r \ n (Windows) и \ n для завершения строки (Linux).

Hennes
источник
Я думаю, что метка порядка байтов убивает мой #! (Первая строка) в моих php-файлах, которые я перенес из windows в linux. Весь файл работает, но он не может найти переводчика, как следует. Если я специально проверяю кодировку в ANSI, выбирая метод кодирования в блокноте, это правда ASCII или Windows делает что-то еще
Посмотрите, есть ли у вас Bomstrip на вашей коробке Gnu / Linux. Это часть Debian (и, по крайней мере, некоторые другие), но может потребоваться установка. Это необходимо, потому что Microsoft ошибочно добавляет спецификацию в начало файлов 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
В основном. Вам также необходимо подсчитать спецификацию, если она имеется.
Игнасио Васкес-Абрамс
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 в любом случае является кодировкой по умолчанию.

user46971
источник
1
Ctrl-Z работает в Windows точно так же, как Ctrl-D (или любой другой символ, с которым вы связали EOF stty) в Linux: драйвер консоли переводит его в конец файла. Буквенный символ не появляется во входном потоке; это только заставляет read () возвращать 0.
psusi
Я думаю, что метка порядка байтов убивает мой #! (Первая строка) в моих php-файлах, которые я перенес из windows в linux. Весь файл работает, но он не может найти переводчика, как следует. Если я специально проверяю кодировку в ANSI, выбирая метод кодирования в блокноте, это правда ASCII или Windows делает что-то еще?
1
Стоит отметить, что псевдо-термин «кодовая страница ANSI», хотя он по-прежнему встречается в таких программах, как Notepad, является совершенно неверным, и Microsoft признала это давно. Смотрите en.wikipedia.org/wiki/Windows_code_page для подробностей.
Incnis Mrsi
У utf-8 нет спецификации, но 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)

РЕДАКТИРОВАТЬ: в другом формате CR и LF:

  • \ n - ASCII 0x0A, перевод строки (LF)
  • \ r является ASCII 0x0D, возврат каретки (CR)
Рич Гомолка
источник
Где находятся \ r \ n и \ n в наборе символов ASCII? en.wikipedia.org/wiki/File:ASCII_Code_Chart.svg
2
@Chris \ n - это ASCII 0x0A, перевод строки. 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 может быть с или без спецификации.

И я использую Windows с Cygwin, хотя порты Windows вполне могут делать \ r \ n, даже если вы укажете \ n Видели, что sed это делает.

Не существует единого правила использования кодировки Unicode конкретной ОС. Это была бы не очень гибкая ОС, если бы была.

Чтобы действительно увидеть различия, знайте, что такое Программное обеспечение, что использует или предлагает Кодировка.

Получите Cygwin и xxd, и / или шестнадцатеричный редактор и посмотрите, что действительно находится внутри файла. Используйте команду «file», чтобы помочь идентифицировать файл. Тогда вы действительно видите, что такое UTF 16bit LE. Что такое UTF 16bit BE. Что такое UTF-8 (а UTF-8 может быть с или без спецификации).

Иногда вы можете указать блокноту сохранить как unicode (под блокнотом подразумевается 16-битный юникод с прямым порядком байтов), и это не так. Но выберите шрифт Unicode, такой как Arial Unicode, и скопируйте несколько символов Unicode из charmap, и это будет ... И хороший способ увидеть, что делает блокнот или какое-либо программное обеспечение, это посмотреть на шестнадцатеричный файл.

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.

Sublime (текстовый редактор Windows) сохраняет Unicode как UTF-8 по умолчанию.

Я использую Windows и иногда Unicode, и я в основном использую UTF-8.

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

barlop
источник
Вы написали команды 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(если это подкаталог bin cygwin) в ваш путь. Также любая внутренняя команда cmd, такая как 'type' или 'dir', или любой внешний exe-файл, такой как calc.exe (Windows Calculator), может быть запущен / запущен из 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 и получить новый файл с другой кодировкой или разные данные на основе старых данных. Команда "file" определяет кодировку на основе байтов.
Бароп
-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
it_is_a_literature
источник
Об этом уже говорилось в ответе, представленном в 2011 году.
Ramhound