Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

источник: Wikipedia

Ответ 2

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

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

Ответ 3

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 байтами - с тех пор они обновили статью.

Ответ 4

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

Ответ 5

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

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

Ответ 6

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 символа).

Ответ 7

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

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

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

Ответ 8

Unicode vs UTF-8

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

Unicode

Unicode обозначается "planes." Каждая плоскость содержит 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 плоскостей) и может кодировать кодовые точки 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

Ответ 9

Пока я согласен с 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).