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