Почему Юникод ограничен до 0x10FFFF? - PullRequest
0 голосов
/ 06 сентября 2018

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

1 Ответ

0 голосов
/ 06 сентября 2018

Это из-за UTF-16. Символы за пределами BMP представлены с использованием суррогатной пары в UTF-16, где первая кодовая единица находится в диапазоне от 0xD800—0xDBFF , а вторая - от 0xDC00—0xDFFF * 1006. *. Каждый блок 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 года RFC 3629 ограничил UTF-8 для соответствия ограничениям кодировки символов UTF-16 : явный запрет кодовых точек, соответствующих старшим и младшим суррогатным символам, убрал более 3% из трехбайтовых последовательностей, заканчивающихся на U + 10FFFF, удалили более 48% четырехбайтовых последовательностей и всех пяти- и шестибайтовых последовательностей.

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

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

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

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

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

...