UTF-8 Продолжение байтов
Я пытаюсь выяснить, что такое "байты продолжения" (для любопытства) в кодировке UTF-8.
Википедия вводит этот термин в статью UTF-8, не определяя его вообще
Поиск Google также не возвращает никакой полезной информации. Я собираюсь перейти к официальной спецификации, но лучше сначала прочитать резюме высокого уровня.
3 ответа
Байт продолжения в UTF-8 - это любой байт, в котором два старших бита 10
,
Они являются последующими байтами в многобайтовых последовательностях. Следующая таблица может помочь:
Unicode code points Range Encoding Binary value
------------------- -------- --------------------------
U+000000-U+00007f 0xxxxxxx 0xxxxxxx
U+000080-U+0007ff 110yyyxx 00000yyy xxxxxxxx
10xxxxxx
U+000800-U+00ffff 1110yyyy yyyyyyyy xxxxxxxx
10yyyyxx
10xxxxxx
U+010000-U+10ffff 11110zzz 000zzzzz yyyyyyyy xxxxxxxx
10zzyyyy
10yyyyxx
10xxxxxx
Здесь вы можете увидеть, как кодовые точки Unicode отображаются на многобайтовые байтовые последовательности UTF-8 и их эквивалентные двоичные значения.
Основные правила таковы:
- Если байт начинается с
0
бит, это значение одного байта меньше 128. - Если это начинается с
11
, это первый байт многобайтовой последовательности и число1
биты в начале указывают на общее количество байтов (110xxxxx
имеет два байта,1110xxxx
имеет три и11110xxx
имеет четыре). - Если это начинается с
10
Байт продолжения.
Это различие позволяет довольно удобную обработку, такую как возможность резервного копирования из любого байта в последовательности, чтобы найти первый байт этой кодовой точки. Просто ищите в обратном направлении, пока не найдете тот, который не начинается с 10
биты.
Точно так же это может также использоваться для UTF-8 strlen
считая только10xxxxxx
байт.
Короче говоря, байты продолжения являются байтами, за исключением первого байта или одного байта. В UTF-8 байты продолжения начинаются с 0x10.
"Продолжение байта" - это не термин, а обычное английское слово, и термин "байт". При использовании в качестве псевдотерминала читатель может запутаться.
Стандарт Unicode использует это выражение только в одном месте, Ch. 5, пункт 5.22: "Например, рассмотрим первые три байта четырехбайтовой последовательности UTF-8, за которыми следует байт, который не может быть действительным продолжающим байтом:". В этом контексте значение ясно: это просто байт, который продолжает что-то, а именно последовательность байтов.
Страница Википедии, очевидно, использует "байт продолжения" для обозначения любого байта в кодировке UTF-8, за исключением первого байта кодированной формы символа.