Сколько символов может кодировать UTF-8?



Если UTF-8 имеет 8 бит, не означает ли это, что может быть только максимум 256 различных символов?



первые 128 кодовых точек такие же, как в ASCII. Но он говорит, что UTF-8 может поддерживать до миллиона знаков?



Как это работает?

879   9  

9 ответов:

UTF-8 не использует один байт все время, это от 1 до 4 байт.

первые 128 символов (US-ASCII) нуждаются в одном байте.

следующие 1,920 символов нужно два байта для кодирования. Это охватывает остальную часть почти всех латинских алфавитов, а также греческий, кириллический, Коптский, армянский, иврит, арабский, сирийский и Тана алфавиты, а также сочетание диакритических знаков.

три байта необходимы для символов в остальной части основного Многоязычная плоскость, которая содержит практически все символы общего использования[12], включая большинство китайских, японских и корейских символов [CJK].

четыре байта необходимы для символов в других плоскостях Юникода, которые включают менее распространенные символы CJK, различные исторические сценарии, математические символы и эмодзи (пиктографические символы).

источник: Википедия

UTF-8 использует 1-4 байта на символ: один байт для символов ascii (первые 128 значений unicode совпадают с ascii). Но для этого требуется только 7 бит. Если установлен самый высокий ("знаковый") бит, это указывает на начало многобайтовой последовательности; количество последовательных высоких бит указывает на количество байтов, затем 0, а остальные биты вносят свой вклад в значение. Для остальных байт, две биты будут 1 и 0, а остальные 6 бит для значение.

таким образом, четырехбайтовая последовательность будет начинаться с 11110... (... = три байта для значения) затем три байта с 6 битами каждый для значения, что дает 21 битное значение. 2^21 превышает количество символов Юникода, поэтому весь Юникод может быть выражен в UTF8.

по данным в этой таблице * UTF-8 должны поддержка:

231 = 2,147,483,648 символов

однако, RFC 3629 ограничил возможные значения, так что теперь мы С ограничением в 4 байта, что дает нам

221 = 2,097,152 символов

обратите внимание, что хороший кусок этих символов "зарезервирован" для пользовательского использования, что на самом деле довольно удобно для иконки-шрифты.

* Википедия использовала таблицу с 6 байтами - с тех пор они обновили статью.

2017-07-11: исправлено для двойного счета одной и той же кодовой точки, закодированной несколькими байтами

2,164,864 "характеры" могут потенциально быть закодированы UTF-8.

это число 2^7 + 2^11 + 2^16 + 2^21 которая исходит из того, как кодировка работает:

  • 1-байтовые символы имеют 7 бит для кодирования 0xxxxxxx (0x00-0x7F)

  • 2-байтовые символы имеют 11 бит для кодирования 110xxxxx 10xxxxxx (0xC0-0xDF для первого байта; 0x80-0xBF для второго)

  • 3-байтовые символы имеют 16 бит для кодирования 1110xxxx 10xxxxxx 10xxxxxx (0xE0-0xEF для первый байт; 0x80-0xBF для байтов продолжения)

  • 4-байтовые символы имеют 21 бит для кодирования 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (0xF0-0xF7 для первого байта; 0x80-0xBF для байтов продолжения)

как вы можете видеть, это значительно больше, чем текущий Unicode (1,112,064 символов).

Unicode vs UTF-8

Unicode разрешает кодовые точки до символов. UTF-8-это механизм хранения для Юникода. Юникод имеет спецификацию. UTF-8 имеет спецификацию. Они оба имеют разные пределы. UTF-8 имеет другую восходящую границу.

Unicode

Unicode обозначается с "самолеты." каждый самолет несет 216 кодовые точки. В Юникоде 17 самолетов. В общей сложности 17 * 2^16 кодовые точки. Элемент первая Плоскость, Плоскость 0 или БМП, является особенным в весе того, что он несет.

вместо того, чтобы объяснять все нюансы, позвольте мне просто процитировать вышеприведенную статью о самолетах.

17 плоскостей могут вместить 1,114,112 кодовых точек. Из них 2 048 являются суррогатами, 66 не являются символами, и 137 468 зарезервированы для частного использования, оставляя 974 530 для общественного назначения.

UTF-8

теперь давайте вернемся к статье, указанной выше,

схема кодирования, используемая UTF-8, была разработана с гораздо большим пределом 231 кодовые точки (32 768 плоскостей), и может кодировать 221 кодовые точки (32 плоскости), даже если они ограничены 4 байтами.[3] поскольку Unicode ограничивает кодовые точки до 17 плоскостей, которые могут быть закодированы UTF-16, кодовые точки выше 0x10FFFF недопустимы в UTF-8 и UTF-32.

таким образом, вы можете видеть, что вы можете поместить материал в UTF-8, который не является допустимым Unicode. Зачем? Потому что UTF-8 вмещает кодовых точек Юникода не поддерживает.

UTF-8, даже с четырех байт, поддерживает 221 кодовые точки, что намного больше, чем 17 * 2^16

UTF-8-это переменной длины кодировка с минимум 8 бит на символ.
Символы с более высокими кодовыми точками будут занимать до 32 бит.

цитата из Википедии: "UTF-8 кодирует каждую из 1,112,064 кодовых точек в наборе символов Юникода, используя от одного до четырех 8-битных байтов (называемых" октетами " в стандарте Юникода)."

некоторые ссылки:

Проверьте стандарт Unicode и связанную с ним информацию, такую как их запись FAQ, UTF-8 UTF-16, UTF-32 & BOM. Это не так гладко, но это достоверная информация, и многое из того, что вы можете прочитать о UTF-8 везде сомнительна.

"8" в "UTF-8" относится к длине код подразделения в битах. Единицы кода-это сущности, используемые для кодирования символов, не обязательно как простое взаимно однозначное сопоставление. UTF-8 использует переменное число код единицы для кодирования символа.

набор символов, которые могут быть закодированы в UTF-8, точно такой же, как для UTF-16 или UTF-32, а именно все символы Юникода. Все они кодируют все пространство кодирования Unicode, который включает в себя даже несимвольные значения UCS и неназначенные кодовые точки.

хотя я согласен с mpen по текущему максимальному коду UTF-8 (2,164,864) (перечисленному ниже, я не мог прокомментировать его), он отключен на 2 уровня, если вы удалите 2 основных ограничения UTF-8: только 4 байта лимита и коды 254 и 255 не могут быть использованы (он только удалил 4 байта лимита).

стартовый код 254 следует за основным расположением стартовых битов (многоразрядный флаг, установленный на 1, Количество 6 1 и терминал 0, без запасных битов), давая вам 6 дополнительных байтов для работы с (6 10xxxxxx групп, дополнительные 2^36 кодов).

начальный код 255 точно не соответствует базовой настройке, нет терминала 0, но все биты используются, давая вам 7 дополнительных байтов (многоразрядный флаг установлен в 1, Количество 7 1 и нет терминала 0, потому что используются все биты; 7 групп 10xxxxxx, дополнительные 2^42 кода).

добавление их в дает окончательный максимальный презентабельный набор символов 4,468,982,745,216. Это больше, чем все символы в текущем использовании, старых или мертвых языках, и любой считал потерянные языки. Ангельский или Небесный сценарий кто-нибудь?

также есть однобайтовые коды, которые игнорируются/игнорируются в стандарте UTF-8 в дополнение к 254 и 255: 128-191 и нескольким другим. Некоторые из них используются локально с помощью клавиатуры, пример кода 128, как правило, удаление backspace. Другие стартовые коды (и связанные с ними диапазоны) недопустимы по одной или нескольким причинам (https://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences).

Comments

    Ничего не найдено.