Поэтому я использую простой текст для почти всей информации, которую храню. Файлы используются (или будут использоваться) со скриптами оболочки, emacs, vim, терминал и т.д. В OSX и Linux. Было бы идеально иметь возможность использовать английские, китайские и скандинавские символы с минимальной головной болью. Предполагая, что производительность не является проблемой, но переносимость и функциональная совместимость есть, будут ли utf-8 или utf-16 лучшей альтернативой для кодирования? Если ни один из вариантов не выглядит явно лучше, каковы соответствующие компромиссы?

1 ответ1

5

Резюме: UTF-8 предпочтительнее.

Различия между UTF-8 и UTF-16 немногочисленны. Оба могут кодировать любую кодовую точку из 1 112 064, поддерживаемых Unicode, и преобразовать один в другой тривиально. Основное отличие - поддержка со стороны программ.

Хотя почти все текстовые редакторы поддерживают обе кодировки, UTF-8 предпочтителен из-за его совместимости с ASCII в первых 128 байтах - другими словами, #!/usr/bin/env bash будет одинаковым в обоих; это означает, что написание shell-скриптов в UTF-8 может быть сделано без каких-либо изменений для операционной системы или для различных интерпретаторов. (Тем не менее, обязательно отключите функцию "метка порядка следования байтов" в UTF-8.)

В Linux, где большинство программ используют языковой стандарт glibc для выбора между наборами символов, UTF-8 является единственным выбором (кроме устаревших кодировок), а UTF-16 вообще не поддерживается.

Одним небольшим отличием является пространство, необходимое для хранения. UTF-8 имеет переменную длину и использует от одного до четырех байтов, а UTF-16 использует двухбайтовые единицы. Если в тексте используется в основном латинский алфавит со случайным скандинавским символом, то UTF-16 будет использовать вдвое больше места, чем UTF-8, так как последний может представлять латинские символы как отдельные байты ASCII, а иногда два или три -байтовые последовательности. С другой стороны, если текст в основном китайский, UTF-8 потребует трехбайтовые последовательности для представления каждого символа, в результате чего файлы будут на 33% больше, чем UTF-16. Однако для текстовых файлов это очень незначительно, учитывая диски терабайтового размера.

Однако использование двухбайтовых "единиц кода" в UTF-16 также является недостатком: для кодирования требуется поддержка как байтовых порядков с прямым порядком байтов, так и байтовых порядков с прямым порядком байтов; оба 54 00 6f 00 72 00 и 00 54 00 6f 00 72 эквивалентны. Это означает, что программы должны поддерживать оба и пытаться угадать, какой порядок байтов используется в данном файле. 54 00 может означать как U+0054, так и U+5400, поэтому включение спецификации BOM - метки порядка байтов - часто необходимо (ff fe может означать только U+FEFF, но не U+FFFE). В случае потери одного байта остальная часть документа становится несинхронизированной. UTF-8 избегает всех этих проблем.

В конце концов, однако, преобразование между кодировками Unicode дешево: iconv -f utf16 -t utf8 - это все, что вам нужно.

См. Также UTF-8 - по сравнению с UTF-16 в Википедии или оригинальным документом UTF-8 от Bell Labs.

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