Почему Юникод ограничен до 0x10FFFF?

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

1 ответ

Решение

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

Поэтому общее количество символов составляет 0x100000 + 0xFFFF = 0x10FFFF. Политики стабильности кодировки символов Unicode гарантируют, что указанный выше код никогда не будет назначен

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

Исторически UTF-8 допускает до U+7FFFFFFF с использованием 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

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

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

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

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

Другие вопросы по тегам