Почему Unicode ограничен 0x10FFFF?

Почему максимальная кодовая точка Unicode ограничена 0x10FFFF? Возможно ли представить Unicode выше этой кодовой точки - например, для 0x10FFFF+0x000001=0x110000 - через любые схемы кодирования типа UTF-16, UTF-8?


person dinesh ranawat    schedule 06.09.2018    source источник


Ответы (1)


Это из-за UTF-16. Символы вне BMP представлены с помощью суррогатная пара в UTF-16, где первая единица кода находится между 0xD800–0xDBFF, а вторая — между 0xDC00–0xDFFF. Каждая из CU представляет 10 бит кодовой точки, что позволяет хранить всего 20 бит данных (0x100000 символов), которые разбиты на 16 плоскостей (16×216 символы). Оставшийся BMP будет представлять 0x10000 символов (кодовые точки 0–0xFFFF).

Таким образом, общее количество символов составляет 0x100000 + 0x10000 = 0x110000, что позволяет использовать кодовые точки от 0 до 0x110000 - 1 = 0x10FFFF. В качестве альтернативы последняя представляемая кодовая точка может быть вычислена следующим образом: Кодовые точки в BMP находятся в диапазоне 0–0xFFFF, поэтому смещение для символов, закодированных суррогатной парой, равно 0xFFFF + 1 = 0x10000, что означает последнюю кодовую точку, которую суррогатная пара представляет собой 0xFFFFF + 0x10000 = 0x10FFFF

Политика стабильности кодировки символов Unicode гарантирует, что кодовая точка выше, которая будет никогда не назначаться

Значение свойства General_Category Surrogate (Cs) является неизменным: набор кодовых точек с этим значением никогда не изменится.

Исторически UTF-8 допускает до U+7FFFFFFFF с использованием 6 байтов, тогда как UTF-32 может хранить в два раза больше этого. Однако из-за ограничения в UTF-16 комитет Unicode решил, что UTF-8 никогда не может быть длиннее 4 байтов, что приводит к тому же диапазону, что и UTF-16.

В ноябре 2003 г. UTF-8 был ограничен RFC 3629, чтобы соответствовать ограничениям UTF-16. кодировка символов: при явном запрещении кодовых точек, соответствующих старшим и младшим суррогатным символам, удалено более 3% трехбайтовых последовательностей, а заканчивающиеся на U+10FFFF удалены более 48% четырехбайтовых последовательностей и все пяти- и шестибайтовые последовательности.

https://en.wikipedia.org/wiki/UTF-8#History

То же самое было применено к UTF-32.

В ноябре 2003 г. Unicode был ограничен RFC 3629, чтобы соответствовать ограничениям кодировки UTF-16: явно запрещены кодовые точки больше U+10FFFF (а также старшие и младшие суррогаты от U+D800 до U+DFFF). Это ограниченное подмножество определяет UTF-32

https://en.wikipedia.org/wiki/UTF-32

Вы можете прочитать этот более подробный ответ и

person phuclv    schedule 06.09.2018
comment
тому, кто проголосовал за это: слишком сложно оставить комментарий, если это неправильно? - person phuclv; 07.09.2018
comment
Я не знаю, кто проголосовал за это, но ваш ответ неверен, но не с огромным отрывом. Диапазон BMP находится в диапазоне от 0x0000-0xD7FF до 0xE000-0xFFFF. Символы в BMP представляются в 1 кодовой единице UTF-16. Когда используются 2 единицы кода, у нас есть 20 бит для кодирования символа. Следовательно, этот набор имеет значения от 0 до 0xFFFFF. Поскольку эти значения в наборе Unicode должны начинаться после BMP, последнее значение которого равно 0xFFFF. Мы добавляем 0x10000 к каждому символу в этом наборе, чтобы правильно индексировать набор символов Unicode. Следовательно, 0x10000 + 0xFFFFF = 0x10FFFF - person Uday Hiwarale; 26.10.2019