15

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

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

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

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

5 ответов5

17

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

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

10

Разрывы строк

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 в любом случае является кодировкой по умолчанию.

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)
1

То, что используется кодировка Unicode, не основано на ОС.

Даже в Windows notepad.exe перечислены параметры - (я заключу в скобки, что означает под этим блокнот) ANSI (не Unicode), Unicode (блокнот означает Unicode LE), Unicode Big Endian (BE), UTF-8

ANSI не является юникодом, он включает в себя очень ограниченное количество символов, поэтому давайте отложим это в сторону.

Но посмотрите, даже блокнот может сделать 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, по крайней мере, технически гибок!

-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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .