Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

AlgStr / Кодировки / UTF-16

.docx
Скачиваний:
40
Добавлен:
23.03.2015
Размер:
27.44 Кб
Скачать

UTF-16

Материал из Википедии — свободной энциклопедии

Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 13 ноября 2010; проверки требуют 35 правок.

Перейти к: навигация, поиск

UTF-16 (англ. Unicode Transformation Format) в информатике — один из способов кодирования символов из Unicode в виде последовательности 16-битных слов. Данная кодировка позволяет записывать символы Юникода в диапазонах U+0000..U+D7FF и U+E000..U+10FFFF (всего 1 112 064 штук). При этом каждый символ записывается одним или двумя словами (суррогатная пара).

Кодировка UTF-16 описана в приложении Q к международному стандарту ISO/IEC 10646, а также ей посвящён IETF RFC 2781 «UTF-16, an encoding of ISO 10646».

Содержание

  • 1 История появления

  • 2 Принцип кодирования

  • 3 Порядок байт

    • 3.1 UTF-16LE и UTF-16ВE

  • 4 UTF-16 в ОС Windows

  • 5 Примеры процедур

    • 5.1 Кодирование

    • 5.2 Раскодирование

  • 6 Ссылки

История появления

Первая версия Юникода (1991 г.) представляла собой 16-битную кодировку с фиксированной шириной символа; общее число разных символов было 216 (65 536). Во второй версии Юникода (1996 г.) было решено значительно расширить кодовую область; для сохранения совместимости с теми системами, где уже был реализован 16-битный Юникод, и была создана UTF-16. Область 0xD800—0xDFFF, отведённая для суррогатных пар, ранее принадлежала к области «символов для частного использования».

Поскольку в UTF-16 можно отобразить 220+216 — 2048 (1 112 064) символов, то это число и было выбрано в качестве новой величины кодового пространства Юникода.

Принцип кодирования

 

DC00

DFFE

DFFF

D800

010000

0103FE

0103FF

D801

010400

0107FE

0107FF

DBFF

10FC00

10FFFE

 

В UTF-16 символы кодируются двухбайтовыми словами с использованием всех возможных диапазонов значений (от 0 до FFFF16). При этом можно кодировать символы Unicode в дипазонах 000016..D7FF16 и E00016..10FFFF16. Исключенный отсюда диапазон D80016..DFFF16 используется как раз для кодирования так называемых суррогатных пар — символов, которые кодируются двумя 16-битными словами. Символы Unicode до FFFF16 включительно (исключая диапазон для суррогатов) записываются как есть 16-битным словом. Символы же в диапазоне 1000016..10FFFF16 (больше 16 бит) уже кодируются парой 16-битных слов. Для этого их код арифметически сдвигается до нуля (из него вычитается минимальное число 1000016). В результате получится значение от нуля до FFFFF16, которое занимает до 20 бит. Старшие 10 бит этого значения идут в лидирующее (первое) слово, а младшие 10 бит — в последующее (второе). При этом в обоих словах старшие 6 бит используются для обозначения суррогата. Биты с 11 по 15 имеют значения 110112, а 10-й бит содержит 0 у лидирующего слова и 1 — у последующего. В связи с этим можно легко определить к чему относится каждое слово.

Порядок байт

Один символ кодировки UTF-16 представлен последовательностью двух байтов. Который из двух идёт впереди, старший или младший, зависит от порядка байтов. Систему, совместимую с процессорами x86, называют little endian, а с процессорами m68k и SPARC — big endian.

Для определения порядка байтов используется метка порядка байтов (англ. Byte order mark). В начале текста записывается код U+FEFF. При считывании, если вместо U+FEFF считалось U+FFFE, значит порядок байтов обратный, поскольку символа с кодом и U+FFFE в Юникоде нет. Так как в кодировке UTF-8 не используются значения 0xFE и 0xFF, можно использовать метку порядка байтов как признак, позволяющий различать UTF-16 и UTF-8.

UTF-16LE и UTF-16ВE

Предусмотрена также возможность внешнего указания порядка байтов — для этого кодировка должна быть описана как UTF-16LE или UTF-16ВE (little-endian / big-endian), а не просто UTF-16. В этом случае метка порядка байтов (U+FEFF) не нужна.

UTF-16 в ОС Windows

Основная статья: Юникод в операционных системах Microsoft

В API Win32, распространённом в современных версиях операционной системы Microsoft Windows, имеется два способа представления текста: в форме традиционных 8-битных кодовых страниц и в виде UTF-16.

В файловых системах NTFS, а также FAT с поддержкой длинных имён, имена файлов записываются в UTF-16LE.

Примеры процедур

Примеры ниже записаны на псевдокоде и в них не учитывается маска порядка байт — они лишь показывают суть кодирования. Порядок байт — от младшего к старшему (Little-Endian, интеловский x86). Тип Word — двухбайтовое слово (16-битное беззнаковое целое), а тип UInt32 — 32-битное беззнаковое целое. Шестнадцатиричные значения начинаются со знака доллара «$».

Кодирование

В примере WriteWord() — условная процедура, которая пишет одно слово (при этом сдвигает внутренний указатель). Функция LoWord() возвращает младшее слово от 32-битного целого (старшие биты не глядя отбрасываются).

// Допустимые значения Code: $0000..$D7FF, $E000..$10FFFF.

Procedure WriteUTF16Char(Code: UInt32)

If (Code < $10000) Then

WriteWord(LoWord(Code))

Else

Code = Code - $10000

Var Lo10: Word = LoWord(Code And $3FF)

Var Hi10: Word = LoWord(Code Shr 10)

WriteWord($D800 Or Hi10)

WriteWord($DC00 Or Lo10)

End If

End Procedure

Раскодирование

В примере ReadWord() читает слово из потока (сдвигая при этом внутренний указатель). Она же при необходимости может корректировать порядок байт. Функция WordToUInt32 расширяет двухбайтовое слово до четырёхбайтового беззнакового целого, заполняя старшие биты нулями. Error() прерывает выполнение (по сути исключение).

// В случае успеха возвращаются значения

// в диапазонах $0000..$D7FF и $E000..$10FFFF.

Function ReadUTF16Char: UInt32

Var Leading: Word // Лидирующее (первое) слово.

Var Trailing: Word // Последующее (второе) слово.

Leading = ReadWord();

If (Leading < $D800) Or (Leading > $DFFF) Then

Return WordToUInt32(Leading)

Else If (Leading >= $DC00) Then

Error("Не допустимая кодовая последовательность.")

Else

Var Code: UInt32

Code = WordToUInt32(Leading And $3FF) Shl 10

Trailing = ReadWord()

If ((Trailing < $DC00) Or (Trailing > $DFFF)) Then

Error("Не допустимая кодовая последовательность.")

Else

Code = Code Or WordToUInt32(Trailing And $3FF)

Return (Code + $10000)

End If

End If

End Function

Ссылки

  • Unicode Technical Note #12: Обработка UTF-16  (англ.)

  • Unicode FAQ: В чём разница между UCS-2 и UTF-16?  (англ.)

  • RFC 2781: UTF-16, an encoding of ISO 10646

  • Полное описание стандарта Unicode  (англ.)

  • ISO-10646-UTF-16 (Информация о конвертировании больших значений в два слова UTF-16)

Соседние файлы в папке Кодировки