Сколько символов можно сопоставить с помощью Юникода? - PullRequest
68 голосов
/ 08 мая 2011

Я прошу подсчет всех возможных действительных комбинаций в Юникоде с объяснением.Я знаю, что символ может быть закодирован как 1,2,3 или 4 байта.Я также не понимаю, почему байты продолжения имеют ограничения, даже если начальный байт этого символа очищает, как долго это должно быть.

Ответы [ 6 ]

94 голосов
/ 08 мая 2011

Я прошу подсчет всех возможных действительных комбинаций в Юникоде с объяснением.

1 111 998 : 17 самолетов и времен; 65 536 знаков на самолет - 2048 суррогатов - 66 нехарактерных символов

Обратите внимание, что UTF-8 и UTF-32 теоретически могут кодировать намного больше, чем 17 плоскостей, но диапазон ограничен на основании ограничений кодировки UTF-16 .

109,384 кодовые точки фактически назначаются в Unicode 6.0 .

Я также не понимаю, почему байты продолжения имеют ограничения, хотя начальный байт этого символа очищает, как долго это должно быть.

Цель этого ограничения в UTF-8 состоит в том, чтобы сделать кодировку самосинхронизирующейся .

В качестве контрпримера рассмотрим китайскую кодировку GB18030. Там буква ß представлена ​​как последовательность байтов 81 30 89 38, которая содержит кодировку цифр 0 и 8. Таким образом, если у вас есть функция поиска строки, не предназначенная для этой специфической для кодирования причуды, то поиск цифры 8 найдет ложный положительный знак в пределах буквы ß.

В UTF-8 этого не может быть, потому что неперекрытие между ведущими байтами и байтами следа гарантирует, что кодирование более короткого символа никогда не может происходить в кодировке более длинного символа.

9 голосов
/ 08 мая 2011

Юникод допускает 17 плоскостей , каждый из 65 536 возможных символов (или «кодовых точек»).Это дает в общей сложности 1,114,112 возможных символов.В настоящее время выделено только около 10% этого пространства.

Точные детали того, как кодируются эти кодовые точки, отличаются от кодировки, но ваш вопрос звучит так, как будто вы думаете о UTF-8.Причина ограничений для байтов продолжения предположительно, поэтому легко найти начало следующего символа (так как символы продолжения всегда имеют форму 10xxxxxx, но начальный байт никогда не может иметь эту форму).

4 голосов
/ 08 мая 2011

Юникод поддерживает 1,114,112 кодовых точек.Имеется 2048 суррогатных кодовых точек, дающих 1,112,064 скалярных значений.Из них 66 не-символов, что приводит к 1111 998 возможным закодированным символам (если я не сделал ошибку в вычислениях).

2 голосов
/ 08 мая 2011

Чтобы дать метафорически точный ответ, all of them.

Байты продолжения в кодировках UTF-8 позволяют выполнять повторную синхронизацию закодированного потока октетов перед лицом "линейного шума". Кодировщик просто нуждается в сканировании вперед для байта, который не имеет значения между 0x80 и 0xBF, чтобы знать, что следующий байт является началом новой символьной точки.

Теоретически, используемые сегодня кодировки позволяют выражать символы, у которых номер символа Unicode составляет до 31 бита. На практике это кодирование фактически реализовано в таких сервисах, как Twitter, где твит с максимальной длиной может кодировать данные объемом до 4340 бит. (140 символов [действительные и недействительные], каждый раз по 31 бит).

1 голос
/ 08 мая 2011

Юникод не является кодировкой, это отображение символов. Согласно Википедии, в настоящее время Unicode содержит 109242 различных символа.

0 голосов
/ 05 сентября 2016

Юникод имеет шестнадцатеричное значение 110000, которое равно 1114112

...