Как работает кодировка переменной ширины UTF-8? - PullRequest
94 голосов
/ 09 октября 2009

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

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

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

Ответы [ 3 ]

116 голосов
/ 09 октября 2009

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

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

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

8 голосов
/ 09 октября 2009

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

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

3 голосов
/ 09 октября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...