Как работает кодировка переменной ширины UTF-8?

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

Фактически, ему удается представить первые 127 символов US-ASCII одним байтом, который выглядит точно так же, как настоящий ASCII, так что вы можете интерпретировать много текста ascii так, как если бы это был UTF-8, ничего не делая с ним. Аккуратный трюк. Итак, как это работает?

Я собираюсь задать свой собственный вопрос и ответить на него здесь, потому что я просто немного почитал, чтобы выяснить это, и я подумал, что это может спасти кого-то еще. Плюс, может быть, кто-то может исправить меня, если я что-то неправильно поняла.

3 ответа

Решение

Каждый байт начинается с нескольких битов, которые сообщают вам, является ли это однобайтовой кодовой точкой, многобайтовой кодовой точкой или продолжением многобайтовой кодовой точки. Как это:

0xxx xxxx    A single-byte US-ASCII code (from the first 127 characters)

Каждая многобайтовая кодовая точка начинается с нескольких битов, которые, по сути, говорят: "Эй, тебе также нужно прочитать следующий байт (или два, или три), чтобы выяснить, кто я". Они есть:

110x xxxx    One more byte follows
1110 xxxx    Two more bytes follow
1111 0xxx    Three more bytes follow

Наконец, все байты, следующие за этими стартовыми кодами, выглядят так:

10xx xxxx    A continuation of one of the multi-byte characters

Поскольку вы можете определить, какой тип байта вы просматриваете, по первым битам, то даже если что-то где-то искажается, вы не потеряете всю последовательность.

RFC3629 - UTF-8, формат преобразования ISO 10646 является окончательным авторитетом здесь и имеет все объяснения.

Короче говоря, несколько битов в каждом байте последовательности в 1–4 байта в кодировке UTF-8, представляющей один символ, используются для указания того, является ли это завершающий байт, начальный байт и, если да, сколько байт следует. Остальные биты содержат полезную нагрузку.

UTF-8 была еще одной системой для хранения вашей строки кодовых точек Unicode, тех магических номеров U+, в памяти, используя 8-битные байты. В UTF-8 каждая кодовая точка от 0 до 127 хранится в одном байте. Только кодовые точки 128 и выше сохраняются с использованием 2, 3, фактически до 6 байтов.

Выдержка из Абсолютного минимума Каждый разработчик программного обеспечения Абсолютно, положительно должен знать о Unicode и наборах символов (никаких оправданий!)

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