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

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

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

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

10 ответов

Решение

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

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

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

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

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

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

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

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

Юникод против UTF-8

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

Unicode

Юникод обозначается как "самолеты". Каждый самолет несет 2 16 кодовых точек. В Юникоде 17 самолетов. Всего 17 * 2^16 кодовые точки. Первая плоскость, плоскость 0 или BMP, отличается весом того, что она несет.

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

17 самолетов могут разместить 1114,112 кодовых точек. Из них 2048 - суррогаты, 66 - не персонажи, а 137 468 зарезервированы для частного использования, а 974 530 - для публичного назначения.

UTF-8,

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

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

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

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

2164864 "символов" могут быть потенциально закодированы с помощью 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 символа).

Согласно этой таблице* UTF-8 должен поддерживать:

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

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

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

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

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

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

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

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

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

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

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

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

Хотя я согласен с 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, как правило, является удалением возврата. Другие начальные коды (и связанные диапазоны) недействительны по одной или нескольким причинам ( https://en.wikipedia.org/wiki/UTF-8).

Unicode твердо женат на UTF-8. Unicode специально поддерживает 2^21 кодовых точек (2 097 152 символа), что является точно таким же количеством кодовых точек, поддерживаемых UTF-8. Обе системы резервируют одинаковое "мертвое" пространство и ограниченные зоны для кодовых точек и т. Д. … По состоянию на июнь 2018 года самая последняя версия, Unicode 11.0, содержит репертуар из 137 439 символов

Из стандарта Юникод. Unicode FAQ

Стандарт Unicode кодирует символы в диапазоне U+0000..U+10FFFF, что составляет 21-битное кодовое пространство.

Со страницы Википедии UTF-8. UTF-8 Описание

Поскольку ограничение кодового пространства Unicode в 21-битных значениях в 2003 году, UTF-8 определено для кодирования кодовых точек в один-четыре байта,...

Другие вопросы по тегам