Я прошу подсчитать все возможные допустимые комбинации в Юникоде с объяснением.
1111998 : 17 самолетов × 65 536 знаков на самолет - 2048 суррогатов - 66 несимволов
Обратите внимание, что UTF-8 и UTF-32 теоретически могут кодировать гораздо больше, чем 17 плоскостей, но диапазон ограничен из-за ограничений кодирования UTF-16 .
137 929 кодовых точек фактически присвоены в Unicode 12.1 .
Я также не понимаю, почему байты продолжения имеют ограничения, хотя начальный байт этого символа очищает, как долго он должен быть.
Цель этого ограничения в UTF-8 - сделать кодировку самосинхронизирующейся .
В качестве контрпримера рассмотрим китайскую кодировку GB 18030 . Там буква ß
представлена как последовательность байтов 81 30 89 38
, которая содержит кодировку цифр 0
и 8
. Поэтому, если у вас есть функция поиска по строке, не предназначенная для этой специфической особенности кодирования, то поиск цифры 8
приведет к ложному срабатыванию внутри буквы ß
.
В UTF-8 этого не может произойти, потому что отсутствие перекрытия между ведущими байтами и конечными байтами гарантирует, что кодирование более короткого символа никогда не может произойти в кодировке более длинного символа.
Unicode допускает 17 плоскостей , каждый из 65 536 возможных символов (или «кодовых точек»). Это дает в общей сложности 1 114 112 возможных символов. В настоящее время выделено лишь около 10% этой площади.
Точные детали того, как эти кодовые точки кодируются, различаются в зависимости от кодировки, но ваш вопрос звучит так, как будто вы думаете о UTF-8. Причина ограничений на байты продолжения, по-видимому, заключается в том, чтобы легко найти начало следующего символа (поскольку символы продолжения всегда имеют форму 10xxxxxx, но начальный байт никогда не может иметь такую форму).
источник
Unicode поддерживает 1114 112 кодовых точек. Существует 2048 суррогатных кодовых точек, дающих 1,112,064 скалярных значения. Из них 66 несимволов, что дает 1 1111 998 возможных закодированных символов (если я не сделал ошибку в расчетах).
источник
Для того, чтобы дать точный ответ метафорически,
all of them
.Байты продолжения в кодировке UTF-8 позволяют повторно синхронизировать закодированный поток октетов перед лицом "линейного шума". Кодировщику просто нужно сканировать вперед для байта, который не имеет значения между 0x80 и 0xBF, чтобы знать, что следующий байт является началом новой точки символа.
Теоретически используемые сегодня кодировки позволяют выражать символы, длина которых в Unicode составляет до 31 бита. На практике это кодирование фактически реализовано в таких сервисах, как Twitter, где твит максимальной длины может кодировать до 4340 бит данных. (140 символов [действительный и недействительный], умноженный на 31 бит каждый.)
источник
perl -le 'print ord "\x{1FFF_FFFF_FFFF}"'
выводит 35184372088831 на 64-битной машине, но дает целочисленное переполнение на 32-битной машине. Вы можете использовать больше символов , как , что внутри PERL программы, но если вы пытаетесь напечатать их как utf8, вы получите обязательное предупреждение , если вы отключите такие:perl -le 'print "\x{1FFF_FFFF}"' Code point 0x1FFFFFFF is not Unicode, may not be portable at -e line 1. ######
. Есть разница между «свободным utf8» и «строгим UTF-8»: первый не ограничен.len(chr(0x10000))
, что дает 2 (единицы кода). Ядро OS X использует UTF-8, правильно, но высокоуровневые API (какао и т. Д.) Используют UTF-16.[𝒜-𝒵]
, и вы поймете, почему я считаю раскрытие UTF-16 провалом. Ошибочно заставлять программистов мыслить в формах кодирования, а не в логических символах.Юникод имеет шестнадцатеричное число 110000, что составляет 1114112
источник
Согласно Википедии , Unicode 12.1 (выпущенный в мае 2019 года) содержит 137 994 различных символа.
источник