UTF-16: различия между версиями

[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
В абзаце написан бред, никаких 11011 в битах с 11 по 15 быть не может, ибо весь диапазон состоит из 2048 чисел, 1024 исп. в 1м суррогате, 1024 во 2м.
→‎Принцип кодирования: уточнение перевода по англоязычной странице
Строка 42:
Символы же в диапазоне 10000<sub>16</sub>..10FFFF<sub>16</sub> (больше 16 бит) кодируются по следующей схеме:
 
* КодИз кода символа арифметически сдвигается до нуля (из него вычитается минимальное число 10000<sub>16</sub>). В результате получится значение от нуля до FFFFF<sub>16</sub>, которое занимаетпомещается дов разрядную сетку 20 бит.
 
* Старшие 10 бит (число в диапазоне 0000<sub>16</sub>..03FF<sub>16</sub>) суммируются с D800<sub>16</sub>, и результат идёт в лидирующее (первое) слово, которое входит в диапазон <span style="color:#00AA00;">D800<sub>16</sub>..DBFF<sub>16</sub></span>.
Строка 48:
* Младшие 10 бит (тоже число в диапазоне 0000<sub>16</sub>..03FF<sub>16</sub>) суммируются с DC00<sub>16</sub>, и результат идёт в последующее (второе) слово, которое входит в диапазон <span style="color:#0070FF;">DC00<sub>16</sub>..DFFF<sub>16</sub></span>.
 
== Порядок байтбайтов ==
Один символ кодировки UTF-16 представлен последовательностью двух байтов или двух пар байтов.
Который из двух байтов идёт впереди, старший или младший, зависит от [[порядок байтов|порядка байтов]].
Систему, совместимую с процессорами [[x86]], называют {{lang-en2|[[порядок байтов|little endian]]}}, а с процессорами [[m68k]] и [[SPARC]] — {{lang-en2|[[порядок байтов|big endian]]}}.
 
Для определения порядка байтов используется [[Byte order mark|метка порядка байтов]] ({{lang-en|Byte order mark}}). В начале текста записывается код U+FEFF. При считывании, если вместо U+FEFF считалось U+FFFE, значит порядок байтов обратный (little endian), поскольку символа с кодом икод U+FFFE в Юникоде нетне кодирует символ и зарезервирован как раз для целей определения порядка байтов. Так как в кодировке UTF-8 не используются значения 0xFE и 0xFF, можно использовать метку порядка байтов как признак, позволяющий различать UTF-16 и UTF-8.
 
=== UTF-16LE и UTF-16BE ===
Строка 68:
== Примеры процедур ==
 
Примеры ниже записаны на псевдокоде и в них не учитывается маска порядка байтбайтов — они лишь показывают суть кодирования.
Порядок байтбайтов — от младшего к старшему (Little-Endian, интеловский x86).
Тип <tt>Word</tt> — двухбайтовое слово (16-битное беззнаковое целое), а тип <tt>UInt32</tt> — 32-битное беззнаковое целое.
Шестнадцатиричные значения начинаются со знака доллара «<tt>$</tt>».
Строка 96:
 
В примере <tt>ReadWord()</tt> читает слово из потока (сдвигая при этом внутренний указатель).
Она же при необходимости может корректировать порядок байтбайтов.
Функция <tt>WordToUInt32</tt> расширяет двухбайтовое слово до четырёхбайтового беззнакового целого, заполняя старшие биты нулями.
<tt>Error()</tt> прерывает выполнение (по сути [[Обработка исключений|исключение]]).