Сколько символов можно сопоставить с Unicode?
Я прошу подсчитать все возможные допустимые комбинации в Unicode с объяснением. Я знаю, что символ может быть закодирован как 1,2,3 или 4 байта. Я также не понимаю, почему байты продолжения имеют ограничения, хотя начальный байт этого символа очищает, как долго он должен быть.
6 ответов:
Я прошу подсчитать все возможные допустимые комбинации в Unicode с объяснением.
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 это не может произойти, потому что неперекрывание между байтами свинца и байтами следа гарантирует, что кодировка более короткого символа никогда не может произойти в кодировке более длинного символа.
Unicode позволяет 17 самолеты, каждый из 65 536 возможных символов (или "кодовых точек"). Это дает в общей сложности 1 114 112 возможных символов. В настоящее время выделено лишь около 10% этого пространства.
точные детали того, как эти кодовые точки кодируются, отличаются от кодировки, но ваш вопрос звучит так, как будто вы думаете о UTF-8. Причина ограничений на байты продолжения предположительно так легко найти начало следующий символ (поскольку символы продолжения всегда имеют форму 10xxxxxx, но начальный байт никогда не может иметь эту форму).
Unicode поддерживает 1,114,112 кодовых точек. Существует 2048 суррогатных кодовых точек, дающих 1,112,064 скалярных значения. Из них есть 66 не-символов, что приводит к 1,111,998 возможных закодированных символов (если я не сделал ошибку вычисления).
чтобы дать метафорически точный ответ,
all of them
.байты продолжения в кодировках UTF-8 позволяют повторно синхронизировать закодированный поток октетов перед лицом "линейного шума". Кодировщик, просто нужно сканировать вперед для байта, который не имеет значения между 0x80 и 0xBF, чтобы знать, что следующий байт является началом новой символьной точки.
теоретически, используемые сегодня кодировки позволяют выражать символы, число символов Юникода которых достигает 31 бит в длину. На практике это кодирование фактически реализовано на таких сервисах, как Twitter, где максимальная длина твита может кодировать до 4 340 бит данных. (140 символов [допустимый и недопустимый], умножить на 31 бит каждый.)