Warning: session_name(): Cannot change session name when session is active in /home/stalko/rodina-ru.com/docs/dokuwiki/inc/init.php on line 231

Warning: session_set_cookie_params(): Cannot change session cookie parameters when session is active in /home/stalko/rodina-ru.com/docs/dokuwiki/inc/init.php on line 232
======UTF-16====== **UTF-16** ([[английский-язык|англ.]] //Unicode Transformation Format//) в [[информатика|информатике]] — один из [[набор-символов|способов кодирования]] символов из [[юникод|Юникода]] в виде последовательности 16-[[бит|битных]] слов. Данная кодировка позволяет записывать символы Юникода в диапазонах U+0000..U+D7FF и U+E000..U+10FFFF (общим количеством 1 112 064). При этом каждый символ записывается одним или двумя словами (суррогатная пара). Кодировка UTF-16 описана в приложении Q к международному стандарту [[universal-character-set|ISO/IEC 10646]], а также ей посвящён IETF [[https://tools.ietf.org/html/rfc2781|RFC 2781]] «UTF-16, an encoding of ISO 10646». =====История появления===== Первая версия Юникода (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 |- ! … | colspan="4"| … |- ! DBFF | 10FC00 | … | 10FFFE | |   |} В UTF-16 символы кодируются двухбайтовыми словами с использованием всех возможных диапазонов значений (от 0 до FFFF16). При этом можно кодировать символы Unicode в дипазонах 000016..D7FF16 и E00016..10FFFF16. Исключенный отсюда диапазон D80016..DFFF16 используется как раз для кодирования так называемых суррогатных пар — символов, которые кодируются двумя 16-битными словами. Символы Unicode до FFFF16 включительно (исключая диапазон для суррогатов) записываются как есть 16-битным словом. Символы же в диапазоне 1000016..10FFFF16 (больше 16 бит) кодируются по следующей схеме: * Код символа арифметически сдвигается до нуля (из него вычитается минимальное число 1000016). В результате получится значение от нуля до FFFFF16, которое занимает до 20 бит. * Старшие 10 бит (число в диапазоне 000016..03FF16) суммируются с D80016, и результат идёт в лидирующее (первое) слово, которое входит в диапазон D80016..DBFF16. * Младшие 10 бит (тоже число в диапазоне 000016..03FF16) суммируются с DC0016, и результат идёт в последующее (второе) слово, которое входит в диапазон DC0016..DFFF16. В обоих словах старшие 6 бит используются для обозначения суррогата. Биты с 11 по 15 (если вести отсчёт от нуля) имеют значения 110112, а 10-й бит содержит 0 у лидирующего слова и 1 — у последующего. В связи с этим можно легко определить, к чему относится каждое слово. =====Порядок байт===== Один символ кодировки UTF-16 представлен последовательностью двух байтов или двух пар байтов. Который из двух идёт впереди, старший или младший, зависит от [[порядок-байтов|порядка байтов]]. Систему, совместимую с процессорами [[x86]], называют //[[порядок-байтов|little endian]]//, а с процессорами [[m68k]] и [[sparc|SPARC]] — //[[порядок-байтов|big endian]]//. Для определения порядка байтов используется [[byte-order-mark|метка порядка байтов]] ([[английский-язык|англ.]] //Byte order mark//). В начале текста записывается код U+FEFF. При считывании, если вместо U+FEFF считалось U+FFFE, значит порядок байтов обратный, поскольку символа с кодом и U+FFFE в Юникоде нет. Так как в кодировке UTF-8 не используются значения 0xFE и 0xFF, можно использовать метку порядка байтов как признак, позволяющий различать UTF-16 и UTF-8. ====UTF-16LE и UTF-16BE==== Предусмотрена также возможность внешнего указания порядка байтов — для этого кодировка должна быть описана как **UTF-16LE** или **UTF-16BE** (little-endian / big-endian), а не просто UTF-16. В этом случае метка порядка байтов (U+FEFF) не нужна. =====UTF-16 в ОС Windows===== В [[интерфейс-программирования-приложений|API]] [[win32|Win32]], распространённом в современных версиях операционной системы [[microsoft-windows|Microsoft Windows]], имеется два способа представления текста: в форме традиционных 8-битных [[кодовая-страница|кодовых страниц]] и в виде UTF-16. При использовании UTF-16, Windows не накладывает ограничений на прикладные программы касательно кодирования текстовых файлов, позволяя им использовать как UTF-16LE, так и UTF-16BE посредством установки и трактовки соответствующей [[маркер-последовательности-байтов|метки порядка байтов]]. Однако внутренний формат Windows - всегда UTF-16LE. Этот момент следует учитывать при работе с [[portable-executable|исполняемыми файлами]], использующими юникодовые версии функций WinAPI. Строки в них всегда кодируются в UTF-16LE(([[https://msdn.microsoft.com/en-us/library/windows/desktop/dd374101(v=vs.85).aspx|Using Byte Order Marks]])). В [[файловая-система|файловых системах]] [[ntfs|NTFS]], а также [[file-allocation-table|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 =====Ссылки===== * [[http://www.unicode.org/notes/tn12/|Unicode Technical Note #12: Обработка UTF-16]]  (англ.) * [[http://www.unicode.org/faq/utf_bom.html#utf16-11|Unicode FAQ: В чём разница между UCS-2 и UTF-16?]]  (англ.) * [[https://tools.ietf.org/html/rfc2781|RFC 2781: UTF-16, an encoding of ISO 10646]]  (англ.) * [[http://www.unicode.org/|Полное описание стандарта Unicode]]  (англ.) * [[http://www.cl.cam.ac.uk/~mgk25/ucs/ISO-10646-UTF-16.html|ISO-10646-UTF-16 (Информация о конвертировании больших значений в два слова UTF-16)]] {| ! colspan="3"| [[категория-компьютерные-кодировки|Кодировки символов]] |- | colspan="2"| Основы | [[алфавит]] • [[текст]] ([[текстовый-файл|файл]] • [[текстовые-данные|данные]]) • [[набор-символов|набор символов]] • [[конверсия-графических-систем-письма|конверсия]] |- | rowspan="2"| Исторические кодировки | Докомп.: | [[семафорная-азбука|семафорная (Макарова)]] • [[азбука-морзе|Морзе]] • [[код-бодо|Бодо]] • [[мтк-2|МТК-2]] |- | Комп.: | [[шестибитная-кодировка|6-битная]] • [[код-упп|УПП]] • [[radix-50|RADIX-50]] • [[ebcdic|EBCDIC]] ([[дкои-8|ДКОИ-8]]) • [[кои-7|КОИ-7]] • [[iso-646|ISO 646]] |- | rowspan="5"| современное\\ [[октет-информатика|8-битное]]\\ представление | [[символьный-тип|символы]] | [[ascii|ASCII]] ([[управляющие-символы|управляющие]] • [[печатные-символы|печатные]]) • [[октеты-со-старшим-битом-1|не-ASCII]] ([[псевдографика]]) |- | 8-битные [[кодовая-страница|код.стр.]] | Кириллица: [[кои-8|КОИ-8]] • [[основная-кодировка|Основная кодировка]] • [[maccyrillic|MacCyrillic]] |- | [[iso-8859|ISO 8859]] | [[iso-8859-1|1 (лат.)]] • [[iso-8859-2|2]] • [[iso-8859-3|3]] • [[iso-8859-4|4]] • [[iso-8859-5|5 (кир.)]] • [[iso-8859-6|6]] • [[iso-8859-7|7]] • [[iso-8859-8|8]] • [[iso-8859-9|9]] • [[iso-8859-10|10]] • [[iso-8859-11|11]] • [[iso-8859-12|12]] • [[iso-8859-13|13]] • [[iso-8859-14|14]] • [[iso-8859-15|15 (€)]] • [[iso-8859-16|16]] |- | Windows | [[windows-1250|1250]] • [[windows-1251|1251 (кир.)]] • [[windows-1252|1252]] • [[windows-1253|1253]] • [[windows-1254|1254]] • [[windows-1255|1255]] • [[windows-1256|1256]] • [[windows-1257|1257]] • [[windows-1258|1258]] • [[windows-glyph-list-4|WGL4]] |- | IBM & DOS | [[cp437|437]] • [[cp850|850]] • [[cp852|852]] • [[cp855|855]] • [[альтернативная-кодировка|866 «альт.»]] • [[болгарская-кодировка|МИК]] • [[кодировка-нии-эвм|НИИ ЭВМ]] |- | rowspan="2"| [[широкий-символ|Многобайтные]] | Традиционные | [[dbcs|DBCS]] ([[gb2312|GB2312]]) • [[кодировки-символов-в-html|HTML]] |- | [[юникод|Unicode]] | [[utf-32|UTF-32]] • **UTF-16** • [[utf-8|UTF-8]] • [[символы-представленные-в-юникоде|список символов]] ([[кириллица-в-юникоде|кириллица]]) |- | colspan="2"| Связанные темы | [[текстовый-интерфейс-пользователя|интерфейс пользователя]] • [[раскладка-клавиатуры|раскладка клавиатуры]] • [[локаль]] • [[перевод-строки|перевод строки]] • [[шрифт]] • [[транслит]] • [[нестандартные-шрифты|нестандартные шрифты]] |- | colspan="2"| Утилиты | [[iconv]] • [[recode]] |} {{tag>Юникод}}