В спецификации UTF-8 RF C 3629 конкретно указано в введении :
Значения октетов C0, C1, F5 до FF никогда не появляется.
Причина этого заключается в том, что 1-байтовая последовательность UTF-8 состоит из 8-битного двоичного шаблона 0xxxxxxx
(ноль, за которым следуют семь битов) и может представлять Unicode кодовые точки, которые помещаются в семь битов (от U + 0000 до U + 007F).
2-байтовая последовательность UTF-8 состоит из 16-битового двоичного шаблона 110xxxxx 10xxxxxx
и может представлять кодовые точки Unicode, которые соответствуют от восьми до одиннадцати битов (от U + 0080 до U + 07FF).
Недопустимо в кодировании UTF-8 использовать больше байтов, чем требуется минимум, поэтому U + 007F можно представить в двух байтах. как <b>110</b>00001 <b>10</b>111111
(C1 BF
hex), он более компактен и поэтому следует спецификации в виде 1-байта <b>0</b>1111111
.
Первое действительное двухбайтовое значение - это кодировка U + 0080, которая является <b>110</b>0010 <b>10</b>000000
(C2 80
hex), поэтому C0
и C1
никогда не появятся.
См. Раздел 3 UTF-8 определен Нация в стандарте. Последний абзац гласит:
Реализации вышеописанного алгоритма декодирования ДОЛЖНЫ защищать от декодирования недопустимых последовательностей. Например, наивная реализация может декодировать слишком длинную последовательность UTF-8 C0 80 в символ U + 0000 ....