Если UTF-8 имеет 8 бит, не означает ли это, что может быть не более 256 различных символов?
Первые 128 кодовых точек такие же, как в ASCII. Но в нем говорится, что UTF-8 может поддерживать до миллиона символов?
Как это работает?
Если UTF-8 имеет 8 бит, не означает ли это, что может быть не более 256 различных символов?
Первые 128 кодовых точек такие же, как в ASCII. Но в нем говорится, что UTF-8 может поддерживать до миллиона символов?
Как это работает?
Ответы:
UTF-8 не использует все время один байт, это от 1 до 4 байтов.
источник: Википедия
источник
UTF-8 использует 1–4 байта на символ: один байт для символов ascii (первые 128 значений Unicode такие же, как и ascii). Но для этого требуется всего 7 бит. Если установлен самый высокий («знаковый») бит, это указывает начало многобайтовой последовательности; количество последовательных установленных высоких битов указывает количество байтов, затем 0, а оставшиеся биты вносят вклад в значение. Для других байтов два старших бита будут 1 и 0, а оставшиеся 6 бит - это значение.
Таким образом, четырехбайтовая последовательность начинается с 11110 ... (и ... = три бита для значения), затем трех байтов по 6 бит для каждого значения, что дает 21-битное значение. 2 ^ 21 превышает количество символов Юникода, поэтому весь Юникод может быть выражен в UTF8.
источник
Согласно этой таблице * UTF-8 должен поддерживать:
2 31 = 2 147 483 648 символов
Однако RFC 3629 ограничил возможные значения, поэтому теперь мы ограничены 4 байтами , что дает нам
2 21 = 2097152 символа
Обратите внимание, что значительная часть этих символов «зарезервирована» для пользовательского использования, что на самом деле очень удобно для иконок-шрифтов.
* Википедия показывала таблицу с 6 байтами - с тех пор они обновили статью.
источник
0xxxxxxx
дает 7 используемых битов,110xxxxx 10xxxxxx
дает еще 11 - перекрытия нет. Первый байт начинается с0
в первом случае, а1
во втором случае.00000001
хранит, а что11000000 100000001
хранит?Юникод против UTF-8
Юникод преобразует кодовые точки в символы. UTF-8 - это механизм хранения Unicode. Unicode имеет спецификацию. UTF-8 имеет спецификацию. У них обоих разные пределы. UTF-8 имеет другую границу вверх.
Unicode
Юникод обозначается словом «плоскости». Каждый самолет несет 2 16 кодовых точек. В Юникоде 17 самолетов. Всего
17 * 2^16
кодовых точек. Первая плоскость, плоскость 0 или BMP , является особенной в весе , что он несет.Вместо того, чтобы объяснять все нюансы, я просто процитирую вышеупомянутую статью о самолетах.
UTF-8
Теперь вернемся к статье, указанной выше,
Итак, вы можете видеть, что вы можете помещать в UTF-8 что-то, что не является допустимым Unicode. Зачем? Потому что UTF-8 поддерживает кодовые точки, которые даже не поддерживает Unicode.
UTF-8, даже с четырехбайтовым ограничением, поддерживает 2 21 кодовых точек, что намного больше, чем
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 (1112 064 символа).
ОБНОВИТЬ
Мой первоначальный расчет неверен, потому что он не учитывает дополнительные правила. См. Комментарии к этому ответу для более подробной информации.
источник
UTF-8 - это кодировка переменной длины с минимум 8 битами на символ.
Символы с более высоким кодом занимают до 32 бит.
источник
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
, поэтому для кодирования фактического символа можно использовать только 21 бит.Цитата из Википедии: «UTF-8 кодирует каждую из 1112 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 (2164864) (перечисленных ниже, я не мог прокомментировать его), он отключится на 2 уровня, если вы удалите 2 основных ограничения UTF-8: только 4 байта limit и коды 254 и 255 использовать нельзя (он только убрал ограничение в 4 байта).
Начальный код 254 следует базовому расположению стартовых битов (многобитовый флаг установлен на 1, счет 6 единиц и терминал 0, нет запасных битов), что дает вам 6 дополнительных байтов для работы (6 групп 10xxxxxx, дополнительные 2 ^ 36 кодов).
Начальный код 255 не совсем соответствует базовой настройке, нет терминала 0, но используются все биты, что дает вам 7 дополнительных байтов (многобитовый флаг установлен на 1, счетчик 7 единиц и нет терминала 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 ).
источник
Юникод неразрывно связан с UTF-8. Unicode, в частности, поддерживает кодовые точки 2 ^ 21 (2097152 символа), что является точно таким же количеством кодовых точек, которые поддерживает UTF-8. Обе системы резервируют одно и то же «мертвое» пространство и зоны ограниченного доступа для кодовых точек и т. Д. ... по состоянию на июнь 2018 года самая последняя версия Unicode 11.0 содержит набор из 137 439 символов.
Из стандарта юникода. Unicode FAQ
Со страницы Википедии UTF-8. Описание UTF-8
источник