table of contents
UTF-8(7) | Руководство программиста Linux | UTF-8(7) |
НАИМЕНОВАНИЕ¶
UTF-8 - ASCII-совместимая многобайтная кодировка Unicode
ОПИСАНИЕ¶
Набор символов Unicode покрывает 16-битное пространство кодов. Наиболее очевидная кодировка Unicode, известная как UCS-2, содержит последовательности 16-битных слов. Такие строки могут содержать комбинации символов (например '\0' или '/'), которые имеют специальное значение в именах файлов и других параметрах функций из библиотеки языка C. Кроме того, большинство утилит UNIX предназначены для обработки ASCII-файлов, и не могут читать 16-битные символы без специальной модификации. По этим причинам UCS-2 является неподходящей кодировкой Unicode в именах файлов, текстовых файлах, переменных окружения и т. д. Стандарт ISO 10646 Universal Character Set (UCS), являющийся надмножеством Unicode, покрывает уже 31-битное пространство кодов, а используемая для него очевидная кодировка UCS-4 (последовательность 32-битных слов) имеет те же проблемы.
Кодировка Unicode и UCS под названием UTF-8 лишена этих недостатков и являются наиболее подходящей для использования набора символов Unicode в Unix-подобных операционных системах.
СВОЙСТВА¶
Кодировка UTF-8 обладает следующими привлекательными свойствами:
- *
- UCS-символы с кодами от 0x00000000 до 0x0000007f (классические символы из набора US-ASCII ) кодируются как байты с кодами 0x00 до 0x7f (совместимость с кодовой таблицей ASCII). Это означает, что файлы и строки, содержащие только 7-битные ASCII символы, будут иметь одинаковое представление как в ASCII, так и в UTF-8.
- *
- Все UCS-символы с кодами > 0x7f кодируются как многобайтовые последовательности, содержащие только байты в диапазоне от 0x80 до 0xfd, так что ASCII байты не окажутся частью другого символа и, как следствие, не будет проблем с использованием '\0' or '/'.
- *
- Сохраняется лексикографический порядок сортировки строк кодировки UCS-4.
- *
- При помощи UTF-8 могут быть закодированы все возможные 2^31 кодов UCS.
- *
- В кодировке UTF-8 никогда не используются байты с кодами 0xfe и 0xff.
- *
- Первый байт многобайтовой последовательности, представляющей один не-ASCII UCS-символ, всегда находится в диапазоне от 0xc0 до 0xfd и указывает, какой длины эта последовательность. Все последующие байты в многобайтовой последовательности находятся в диапазоне от 0x80 до 0xbf. Это обеспечивает легкую ресинхронизацию, устраняет необходимость учитывать состояние входного потока (statelessness) и делает кодировку устойчивой к пропущенным байтам.
- *
- Символы UCS, закодированные в UTF-8, могут быть до шести байт в длину, тогда как символы Unicode могут иметь длину лишь до трех байт. Так как Linux использует только 16-битное подмножество UCS -- Unicode, то под Linux многобайтовые последовательности UTF-8 могут быть одно-, двух- или трехбайтными.
КОДИРОВКА¶
Нижеследующие последовательности байт используются для представления символов. Конкретная используемая последовательность зависит от номера символа в кодировке UCS:
- 0x00000000 - 0x0000007F:
- 0xxxxxxx
- 0x00000080 - 0x000007FF:
- 110xxxxx 10xxxxxx
- 0x00000800 - 0x0000FFFF:
- 1110xxxx 10xxxxxx 10xxxxxx
- 0x00010000 - 0x001FFFFF:
- 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
- 0x00200000 - 0x03FFFFFF:
- 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
- 0x04000000 - 0x7FFFFFFF:
- 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
Позиции битов, обозначенные как xxx, заполняются соответствующими битами из кода символа в бинарном представлении. Используется кратчайшая из возможных многобайтовых последовательностей, которые могут представить код символа.
ПРИМЕРЫ¶
Символ Unicode с кодом 0xa9 = 1010 1001 (знак copyright) кодируется в UTF-8 как
а символ с кодом 0x2260 = 0010 0010 0110 0000 (знак "не равно") кодируется так:
БЕЗОПАСНОСТЬ¶
Спецификация Unicode требует, чтобы при записи файлов в UTF-8 использовалась самая короткая из возможных форма записи; например, двухбайтная последовательность с первым байтом 0xc0 не соответствует стандарту. Был также опубликован "UTF-8 Corrigendum" (поправка к стандарту), в котором программам запрещается принимать входные данные с не самыми короткими формами записи. Это сделано из соображений безопасности: если входные данные проверяются на предмет возможных нарушений безопасности, то программа может проверять только ASCII-версию последовательностей типа "/../", ";" или NUL, и при этом упустить из виду, что есть множество не соответствующих ASCII методов представить такие последовательности. См. также IETF RFC 2279.
Однако, некоторые системы (использующие NUL для завершения строк) используют C0 80 для внутреннего представления NUL (ASCII 00).
СТАНДАРТЫ¶
ISO 10646, Unicode 1.1, XPG4, Plan 9.
АВТОР¶
Markus Kuhn <mskuhn@cip.informatik.uni-erlangen.de>
СМОТРИ ТАКЖЕ¶
ПЕРЕВОД¶
Перевел с английского Алексей Миллер <asm@asm.kiev.ua> 2000
26 ноября 1995 | Linux |