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


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

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

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

3 84

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 является окончательным авторитетом здесь и имеет все объяснения.

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

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

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