Общее количество символов UTF16 - PullRequest
6 голосов
/ 13 февраля 2011

Можете ли вы рассчитать, что кодировка UTF16 представляет 1112 064 числа по перестановкам / комбинациям?

Ответы [ 5 ]

6 голосов
/ 13 февраля 2011

Стандарт UNICODE в разделе 3.9 гласит:

Каждая форма кодирования отображает кодовые точки Unicode U + 0000..U + D7FF и U + E000..U + 10FFFF в уникальные последовательности кодовых единиц.

Следовательно, количество кодовых точек («символов»), которые могут быть представлены в UTF-16, равно

0xD7FF + 1 + (0x10FFFF - 0xE000) + 1 = 1 112 064

Стандарт UNICODE обычно 32-битный. Тем не менее, определенные кодировки резервируют меньшее количество битов для представления наиболее распространенных символов, накладывают определенные ограничения на реальное количество символов, которые они могут юридически представлять. Для учета более длинных битовых последовательностей, которые, в свою очередь, позволяют описывать кодовые точки длиннее 8 (UTF-8) или 16 (UTF-16) битов, определяются специальные суррогатные кодовые точки.

Кроме того, возможность представлять данную кодовую точку в данной кодировке не означает, что она действительна - она ​​должна быть сначала выделена и описана стандартом UNICODE. Поэтому не существует математической формулы, которая бы вырабатывала количество символов, которое можно представить, а число 1 112 064 не обязательно означает, что существует 1M допустимых символов.

Подробнее об этом см. раздел 3.9 стандарта UNICODE.

4 голосов
/ 13 февраля 2011

Нет.Количество символов, представленных в UTF-16, можно узнать только по спецификации, а не по математике.UTF-16 - это определенный набор правил кодирования, изложенных людьми, а не внутреннее свойство какой-либо формулы.

1 голос
/ 14 февраля 2011

Существует три вида кодовых единиц UTF-16:

  • Высокие суррогаты (от U + D800 до U + DBFF).Их 1024.
  • Низкие суррогаты (от U + DC00 до U + DFFF).Их 1024.
  • Непосредственно представимые символы в BMP.Их 65536-2 * 1024 = 63488.

Имеются 1024 × 1024 = 1 048 576, которые могут быть представлены через суррогаты («дополнительные символы» от U + 10000 до U + 10FFFF).Добавьте 63 488 представимых символов в BMP, и вы получите 1 112 064.

1 голос
/ 13 февраля 2011

Вы можете представить скалярные значения 1112064 в UTF-16, потому что есть скалярные значения 1112064, как определено определением D76 в разделе 3.9 Стандарта, и потому что форма кодирования UTF-16 (как и все формы кодирования Unicode) является уникальным представлениемвсех скалярных значений Unicode, как определено в определении D79.

D76 - Скалярное значение Unicode: Любая кодовая точка Unicode, кроме high-surrogate и low-суррогатные кодовые точки.

  • В результате этого определения набор скалярных значений Unicode состоит из диапазонов от 0 до D7FF и от E000 до 10FFFF включительно.

D79 - A Форма кодирования Unicode присваивает каждое скалярное значение Unicode уникальной последовательности единиц кода.

Конечно, эти числа не являются полностью произвольными из-замеханизм кодирования суррогатной пары изложен в определении D91.Учитывая распределение битов в Таблице 3-5, просто нет способа кодировать скалярное значение выше 10FFFF.

1 голос
/ 13 февраля 2011

Смотрите ответ здесь https://stackoverflow.com/questions/280182/

Это почти так же хорошо, как спецификация, ну, он сочетает в себе некоторые спецификации. Я процитирую:

UTF-16 - код переменной длины; его символы занимают 2 или 4 байта. 2-байтовые значения в диапазоне 0xD800-0xDFFF зарезервированы для построения 4-байтовых символов, а все 4-байтовые символы состоят из двух байтов в диапазоне 0xD800-0xDBFF, за которыми следуют 2 байта в диапазоне 0xDC00-0xDFFF. По этой причине Unicode не назначает никаких символов в диапазоне U + D800-U + DFFF.

Емкость UTF-16: 1 112 064

...