В стандарте unicode достаточно кодовых точек, поэтому вам нужно 4 байта для их хранения. Вот что делает кодировка UTF-32. Тем не менее, кодировка UTF-8 каким-то образом сжимает их в гораздо меньшие пространства, используя так называемое «кодирование переменной ширины».
Фактически, ему удается представить первые 127 символов US-ASCII всего одним байтом, который выглядит в точности как настоящий ASCII, поэтому вы можете интерпретировать много текста ascii, как если бы это был UTF-8, ничего не делая с ним. Аккуратный трюк. Итак, как это работает?
Я собираюсь задать и ответить на свой вопрос здесь, потому что я просто немного прочитал, чтобы понять это, и подумал, что это может сэкономить время кому-то еще. Плюс, может быть, кто-нибудь поправит меня, если я что-то ошибся.
источник
Ответы:
Каждый байт начинается с нескольких битов, которые говорят вам, является ли это однобайтовой кодовой точкой, многобайтовой кодовой точкой или продолжением многобайтовой кодовой точки. Как это:
Каждая многобайтовая кодовая точка начинается с нескольких битов, которые, по сути, говорят: «Эй, вам нужно также прочитать следующий байт (или два, или три), чтобы понять, кто я». Они есть:
Наконец, все байты, следующие за этими стартовыми кодами, выглядят следующим образом:
Поскольку вы можете определить, на какой байт вы смотрите, по первым нескольким битам, то даже если что-то где-то испортится, вы не потеряете всю последовательность.
источник
next char is continuation
? Если бы мы получили 3-байтовый символ, это было бы так:,1xxxxxxx 1xxxxxxx 0xxxxxxx
поэтому было бы потрачено меньше места.RFC3629 - UTF-8, формат преобразования ISO 10646, является здесь окончательным авторитетом и содержит все пояснения.
Короче говоря, несколько битов в каждом байте последовательности от 1 до 4 байтов в кодировке UTF-8, представляющей один символ, используются для указания того, является ли он конечным байтом, ведущим байтом и, если да, то сколько байтов следует за ним. Остальные биты содержат полезную нагрузку.
источник
Отрывок из «Абсолютного минимума». Каждый разработчик программного обеспечения должен абсолютно точно знать о Unicode и наборах символов (без оправданий!)
источник