Scroll to navigation

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 как

11000010 10101001 = 0xc2 0xa9

а символ с кодом 0x2260 = 0010 0010 0110 0000 (знак "не равно") кодируется так:

11100010 10001001 10100000 = 0xe2 0x89 0xa0

БЕЗОПАСНОСТЬ

Спецификация 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>

СМОТРИ ТАКЖЕ

unicode(7)

ПЕРЕВОД

Перевел с английского Алексей Миллер <asm@asm.kiev.ua> 2000

26 ноября 1995 Linux