Почему максимальная кодовая точка Unicode ограничена 0x10FFFF? Возможно ли представить Unicode выше этой кодовой точки - например, для 0x10FFFF+0x000001=0x110000 - через любые схемы кодирования типа UTF-16, UTF-8?
Почему Unicode ограничен 0x10FFFF?
Ответы (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% четырехбайтовых последовательностей и все пяти- и шестибайтовые последовательности.
То же самое было применено к UTF-32.
В ноябре 2003 г. Unicode был ограничен RFC 3629, чтобы соответствовать ограничениям кодировки UTF-16: явно запрещены кодовые точки больше U+10FFFF (а также старшие и младшие суррогаты от U+D800 до U+DFFF). Это ограниченное подмножество определяет UTF-32
Вы можете прочитать этот более подробный ответ и
- Различаются ли UTF-8, UTF-16 и UTF-32 количеством символов, которые они могут хранить?
- Намерен ли Консорциум Unicode сделать так, чтобы UTF-16 исчерпал символы?
- Сколько символов можно сопоставить с Unicode?
- Предложение ограничить диапазон кодовых позиций значениями до U-0010FFFF