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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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