Откройте актуальную версию документа прямо сейчас
Если вы являетесь пользователем интернет-версии системы ГАРАНТ, вы можете открыть этот документ прямо сейчас или запросить по Горячей линии в системе.
Приложение ДБ
(обязательное)
Перевод разделов 9, 10 международного стандарта ISO/IEC 10646:2017
9 Формы кодирования UCS
9.1 Общие положения
Настоящий международный стандарт предоставляет три формы кодирования, выражающие каждое UCS скалярное значение в виде одного уникального кодового набора или последовательности нескольких уникальных кодовых наборов. Они называются UTF-8, UTF-16 и UTF-32 соответственно (от англ. Unicode Transformation Format, 8-bit, 16-bit, 32-bit - формат преобразования Юникода, 8-бит, 16-бит, 32-бит соответственно).
9.2 UTF-8
UTF-8 является формой кодирования UCS, которая присваивает каждому скалярному значению UCS байтовую последовательность из одного-четырех байтов, как определено в таблице 2.
- Символы UCS из "BASIC LATIN" (базового набора латиницы) представлены в UTF-8 в соответствии с ISO/IEC 4873, т.е. в виде отдельных байтов со значениями от 20 до 7Е.
- Функции управления в кодовых точках от 0000 до 001F и управляющий символ в кодовой точке 007F представлены без использования набора байтов, установленных в разделе 11 настоящего стандарта, т.е. в виде одиночных байтов со значениями от 00 до 1F и 7F соответственно, в соответствии с ISO/IEC 4873 и с 8-битной структурой ISO/IEC 2022.
- Байт значений от 00 до 7F создается исключительно в кодировке UTF-8 для каждого символа. Это обеспечивает совместимость с существующими системами обработки файлов и подсистемами связи, которые анализируют последовательности единиц кода для байта этих значений.
- Первый байт в кодированном представлении UTF-8 любого символа может быть непосредственно идентифицирован при проверке последовательности единиц кода, по очереди по одному байту, начиная с произвольного местоположения. Он указывает количество байтов (если таковые имеются) в последовательности из нескольких байтов, составляющей кодовое представление этого символа.
Таблица 2 задает битовое распределение для формы кодирования UTF-8, показывая диапазоны скалярных значений UCS, соответствующих одной, двум, трем и четырем последовательностям байтов.
Таблица 2 - Распределение битов UTF-8
Скалярное значение |
1-й байт |
2-й байт |
3-й байт |
4-й байт |
000000000ххххххх |
0ххххххх |
|
|
|
00000ууууухххххх |
110ууууу |
10хххххх |
|
|
zzzzyyyyyyxxxxxx |
1110zzzz |
10уууууу |
10хххххх |
|
000uuuuuzzzzyyyyyyxxxxxx |
11110uuu |
10uuzzzz |
10уууууу |
10хххххх |
Поскольку суррогатные кодовые точки не являются скалярными значениями UCS, любая последовательность UTF-8, которая иначе сопоставлялась бы с кодовыми точками D800-DFFF, сформирована некорректно.
В таблице 3 перечислены все диапазоны (включительно) байтовых последовательностей, которые правильно сформированы в UTF-8. Любая последовательность UTF-8, которая не соответствует шаблонам, перечисленным в таблице 3, является некорректной.
Таблица 3 - Правильно сформированные последовательности байтов UTF-8
Кодовые точки |
1-й байт |
2-й байт |
3-й байт |
4-й байт |
0000-007F |
00-7F |
|
|
|
0080-07FF |
C2-DF |
80-BF |
|
|
0800-0FFF |
Е0 |
A0-BF |
80-BF |
|
1000-CFFF |
Е1-ЕС |
80-BF |
80-BF |
|
D000-D7FF |
ED |
80-9F |
80-BF |
|
E000-FFFF |
EE-EF |
80-BF |
80-BF |
|
10000-3FFFF |
F0 |
90-BF |
80-BF |
80-BF |
40000-FFFFF |
F1-F3 |
80-BF |
80-BF |
80-BF |
100000-10FFFF |
F4 |
80-8F |
80-BF |
80-BF |
Для соблюдения условий корректности, указанных в таблице 9.2, в UTF-8 запрещены следующие байтовые значения: С0-С1, F5-FE.
9.3 UTF-16
UTF-16 является формой кодирования UCS, которая выражает каждое скалярное значение UCS последовательностью одного-двух не использованных ранее 16-разрядных кодов, как определено в таблице 4.
В форме кодирования UTF-16, кодовые точки в диапазоне 0000-D7FF и E000-FFFF представлены в виде пар 16-разрядных кодовых единиц. Эти пары специальных кодовых единиц называются суррогатными парами.
Значения кодовых единиц, используемых для суррогатных пар, не совпадают с кодовыми единицами, используемыми для представления единичных кодовых единиц, что обеспечивает неперекрываемость для всех представлений кодовых точек в UTF-16.
UTF-16 оптимизирует представление символов в формате BMP (от англ. Bitmap Picture - "битовая карта изображения", формат графических файлов, состоящих из четырех частей: заголовка, информационного заголовка, таблицы цветов (палитры) и данных изображения), содержащем подавляющее большинство символов общего пользования.
Поскольку суррогатные кодовые точки не являются скалярными значениями UCS, непарные единицы суррогатного кода сформированы некорректно.
Таблица 4 показывает распределение битов для формы кодирования UTF-16. Вычисление значений суррогатной пары включает вычитание шестнадцатеричных 10000 для учета начального смещения к скалярному значению (выраженному как 'wwww = uuuu-1' в таблице).
Таблица 4 - Распределение UTF-16 бит
Скалярное значение |
UTF-16 |
хххххххххххххххх |
хххххххххххххххх |
000uuuuuхххххххххххххххх |
110110wwwwxxxxxx 110111хххххххххх |
Примечание - Предыдущие издания этого международного стандарта включали ссылки на двухбайтовую форму кодирования BMP под названием UCS-2, которая является подмножеством формы кодирования UTF-16, ограниченным скалярными значениями BMP UCS. Форма UCS-2 устарела.
9.4 UTF-32 (UCS-4)
UTF-32 (или UCS-4) является формой кодирования UCS, которая присваивает каждому скалярному значению UCS единственный уникальный 32-разрядный код без знака. Термины UTF-32 и UCS-4 могут использоваться как взаимозаменяемые для обозначения этой формы кодирования.
Поскольку суррогатные кодовые точки не являются скалярными значениями UCS, кодовые единицы UTF-32 в диапазоне 0000 D800 - 0000 DFFF сформированы некорректно.
10 Схемы кодирования UCS
10.1 Общие положения
Схемы кодирования сериализованными байтами характерны для каждой формы кодирования UCS, включая спецификацию подписи, если это допускается. Подпись представляет собой последовательность единиц кода, соответствующую кодовой точке "FEFF ZERO WIDTH NO-BREAK SPACE" (неразрывного пробела нулевой ширины) в соответствующей форме кодирования. При использовании подписи в начале потока сериализованных байтов указывают порядок байтов в форме кодирования, используемой для представления символов.
Настоящий международный стандарт определяет семь схем кодирования: UTF-8, UTF-16BE, UTF-16LE, UTF-16, UTF-32BE, UTF-32LE, и UTF-32.
10.2 UTF-8
Схема кодирования UTF-8 сериализует последовательность единиц кода UTF-8 в том же порядке, в каком чередуются наборы кодов.
При кодировании в UTF-8 подпись превращается в последовательность байт <EF ВВ BF>. Их использование в начале потока данных UTF-8 не является ни обязательным, ни рекомендуемым, но не влияет на соответствие.
10.3 UTF-16BE
Схема кодирования UTF-16BE сериализует кодовую последовательность UTF-16, упорядочивая байты таким образом, что наиболее значимый байт (старший) предшествует менее значимому байту (младшему). Порядок от старшего к младшему.
Примечание - Этот порядок известен, как порядок big-endian от англ. - большой конец. Этот порядок соответствует привычному порядку записи арабских цифр, например, число сто двадцать три было бы записано при таком порядке как 123.
В UTF-16BE начальная последовательность байтов <FE FF> интерпретируется как "FEFF ZERO WIDTH NO-BREAK SPACE" (неразрывный пробел нулевой ширины) и не передает значение подписи.
10.4 UTF-16LE
Схема кодирования UTF-16LE сериализует последовательность единиц кода UTF-16, упорядочивая байты таким образом, что младший байт предшествует старшему байту (порядок от младшего к старшему).
В UTF-16LE начальная последовательность байтов <FE FF> интерпретируется как "FEFF ZERO WIDTH NO-BREAK SPACE" (неразрывный пробел нулевой ширины) и не передает значение подписи.
10.5 UTF-16
Схема кодирования UTF-16 сериализует последовательность единиц кода UTF-16, упорядочивая байты таким образом, что младший байт предшествует или следует за старшим байтом.
В схеме кодирования UTF-16 начальная подпись, читаемая как <FE FF>, указывает, что старший байт предшествует младшему байту, a <FF FE> - наоборот. Подпись не является частью текстовых данных.
При отсутствии подписи порядок байт схемы кодирования UTF-16 состоит в том, что старший байт предшествует младшему байту.
10.6 UTF-32BE
Схема кодирования UTF-32BE сериализует последовательность единиц кода UTF-32, упорядочивая байты таким образом, что старшие байты предшествуют младшим байтам (порядок от старшего к младшему).
В UTF-32BE начальная последовательность байт <00 00 FE FF> интерпретируется как FEFF ZERO WIDTH NO-BREAK SPACE (неразрывный пробел нулевой ширины) и не передает значение подписи.
10.7 UTF-32LE
Схема кодирования UTF-32LE сериализует последовательность единиц кода UTF-32, упорядочивая байты таким образом, что младший байт предшествует старшему байту (порядок от младшего к старшему).
В UTF-32LE начальная последовательность байт <FF FE 00 00> интерпретируется как FEFF ZERO WIDTH NO-BREAK SPACE (неразрывный пробел нулевой ширины) и не передает значение подписи.
10.8 UTF-32
Схема кодирования UTF-32 сериализует последовательность единиц кода UTF-32, упорядочивая байты таким образом, что младшие байты предшествуют или следуют за старшими байтами.
В схеме кодирования UTF-32 начальная подпись <00 00 FE FF> указывает, что старший байт предшествует младшему байту, a <FF FE 00 00> - наоборот. Подпись не является частью текстовых данных.
При отсутствии подписи порядок байт схемы кодирования UTF-32 состоит в том, что старший байт предшествует младшему байту.
Если вы являетесь пользователем интернет-версии системы ГАРАНТ, вы можете открыть этот документ прямо сейчас или запросить по Горячей линии в системе.