Если UTF-8 - 8 бит, не означает ли это, что может быть только 256 различных символов?
Первые 128 кодовых точек те же, что и в ASCII. Но он говорит, что UTF-8 может поддерживать до миллиона символов?
Как это работает?
Если UTF-8 - 8 бит, не означает ли это, что может быть только 256 различных символов?
Первые 128 кодовых точек те же, что и в ASCII. Но он говорит, что UTF-8 может поддерживать до миллиона символов?
Как это работает?
UTF-8 не использует один байт все время, это от 1 до 4 байтов.
Первые 128 символов (US-ASCII) нуждаются в одном байте.
Следующие 1920 символов нуждаются в двух байтах для кодирования. Это охватывает остаток почти всех латинских алфавитов, а также греческий, кириллический, коптский, армянский, иврит, арабский, сирийский и танаский алфавиты, а также сочетание диакритических знаков.
Для остальной части базовой многоязычной плоскости требуются три байта, которые содержат практически все используемые символы [12], включая большинство китайских, японских и корейских символов [CJK].
Для символов в других плоскостях Unicode необходимы четыре байта, которые включают менее распространенные символы CJK, различные исторические сценарии, математические символы и эможи (пиктографические символы).
источник: Wikipedia
UTF-8 использует 1-4 байта на символ: один байт для символов ascii (первые 128 значений юникода совпадают с ascii). Но для этого требуется только 7 бит. Если установлен самый старший ( "знаковый" ) бит, это указывает на начало многобайтовой последовательности; количество последовательных наборов высоких бит указывает количество байтов, затем 0, а остальные бит вносят вклад в это значение. Для остальных байтов наивысшие два бита будут равны 1 и 0, а остальные 6 бит - для значения.
Итак, последовательность из четырех байтов начнется с 11110... (... = три байта для значения), а затем три байта с 6 битами для значения, что даст 21-битное значение. 2 ^ 21 превышает количество символов в Юникоде, поэтому весь юникод может быть выражен в UTF8.
2017-07-11: Исправлено для двойного подсчета той же кодовой точки, кодированной несколькими байтами
В соответствии с эта таблица * UTF-8 должен поддерживать:
2 7 + 2 11 + 2 16 + 2 21 + 2 26 + 2 31= 2,216,757,376 символов
2 31= 2,147,483,648 символов
Однако RFC 3629 ограничил возможные значения, так что теперь мы ограничены 4 байтами, что дает нам
2 7 + 2 11 + 2 16 + 2 21= 2,164,864 символов дель >
2 21= 2,097,152 символа
Обратите внимание, что хороший фрагмент этих символов "зарезервирован" для пользовательского использования, что на самом деле очень удобно для иконки-шрифтов.
* Используемая Википедия показывает таблицу с 6 байтами - с тех пор они обновили статью.
UTF-8 - это кодирование с переменной длиной минимум из 8 бит на символ.
Символы с более высокими кодовыми точками будут занимать до 32 бит.
Цитата из Википедии: "UTF-8 кодирует каждый из 1112 064 кодовых точек в наборе символов Юникода, используя от одного до четырех 8-битных байтов (называемых" октетами "в стандарте Unicode).
Некоторые ссылки:
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 и соответствующей информацией, например, с записью в FAQ, UTF-8 UTF-16, UTF-32 и спецификацией. Это не то, что плавное плавание, но его авторитетная информация, и многое из того, что вы можете прочитать о UTF-8 в другом месте, вызывает сомнения.
"8" в "UTF-8" относится к длине блоков кода в битах. Единицы кода - это объекты, используемые для кодирования символов, а не как простое взаимно однозначное сопоставление. UTF-8 использует переменное количество блоков кода для кодирования символа.
Коллекция символов, которые могут быть закодированы в UTF-8, точно такая же, как для UTF-16 или UTF-32, а именно всех символов Юникода. Все они кодируют всю кодировку Unicode, которая включает даже нехарактеры и неназначенные коды.
Юникод разрешает коды указывает на символы. UTF-8 является механизмом хранения Unicode. Юникод имеет спецификацию. UTF-8 имеет спецификацию. У них обоих разные границы. UTF-8 имеет разную верхнюю границу.
Unicode обозначается "planes." Каждая плоскость содержит 2 16 кодовых точек. В Юникоде есть 17 самолетов. В общей сложности 17 * 2^16
кодовых точек. первая плоскость, плоскость 0 или BMP, является особой по весу того, что она несет.
Вместо того, чтобы объяснять все нюансы, позвольте мне просто привести приведенную выше статью о самолетах.
17 самолетов могут вместить 1114 112 пунктов кода. Из них 2048 - суррогаты, 66 - несимвольные, а 137 468 зарезервированы для личного использования, оставив 974 530 для публичного задания.
Теперь вернемся к статье, приведенной выше,
Схема кодирования, используемая UTF-8, была разработана с гораздо большим пределом кодовых точек 2 31 (32 768 плоскостей) и может кодировать кодовые точки 2 21 ( 32), даже если они ограничены 4 байтами. [3] Поскольку Unicode ограничивает код, он указывает на 17 плоскостей, которые могут быть закодированы UTF-16, в UTF-8 и UTF-32 недопустимы коды выше 0x10FFFF.
Итак, вы можете видеть, что вы можете поместить материал в UTF-8, который недействителен Unicode. Зачем? Поскольку UTF-8 поддерживает кодовые точки, которые Unicode даже не поддерживает.
UTF-8, даже с ограничением в четыре байта, поддерживает 2 21 кодовые точки, что намного больше, чем 17 * 2^16
Пока я согласен с 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. Это больше, чем все символы в текущем использовании, старые или мертвые языки и любые верифицированные потерянные языки. Angelic или Celestial script кто-нибудь?
Также есть одиночные байтовые коды, которые игнорируются/игнорируются в стандарте UTF-8 в дополнение к 254 и 255: 128-191 и нескольким другим. Некоторые из них используются локально клавиатурой, например, код 128 обычно является удалением обратного пространства. Другие стартовые коды (и связанные диапазоны) недействительны по одной или нескольким причинам (https://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences).