Как работает UTF-8 “кодировка переменной ширины”?
-
20-09-2019 - |
Вопрос
Стандарт unicode содержит достаточно кодовых точек, чтобы вам потребовалось 4 байта для их хранения.Это то, что делает кодировка UTF-32.Тем не менее, кодировка UTF-8 каким-то образом втискивает их в гораздо меньшие пространства, используя нечто, называемое "кодирование переменной ширины".
Фактически, ему удается представить первые 127 символов US-ASCII всего в одном байте, который выглядит в точности как настоящий ASCII, поэтому вы можете интерпретировать большое количество текста ascii так, как если бы это был UTF-8, ничего с ним не делая.Ловкий трюк.Итак, как же это работает?
Я собираюсь задать здесь свой собственный вопрос и ответить на него, потому что я просто немного почитал, чтобы разобраться в нем, и подумал, что это может сэкономить кому-то еще немного времени.Плюс, может быть, кто-нибудь сможет поправить меня, если я что-то напутал.
Решение
Каждый байт начинается с нескольких битов, которые сообщают вам, является ли это однобайтовой кодовой точкой, многобайтовой кодовой точкой или продолжением многобайтовой кодовой точки.Вот так:
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 байт.