为什么有必要在UTF-8中标记连续字节?

Cur*_*tel 4 unicode utf-8 utf character-encoding

我最近一直在阅读UTF-8可变宽度编码,我发现奇怪的是,UTF-8指定每个连续字节的前两位为10.

 Range           |  Encoding
-----------------+-----------------
     0 - 7f      |  0xxxxxx
    80 - 7ff     |  110xxxx 10xxxxxx
   800 - ffff    |  1110xxx 10xxxxxx 10xxxxxx
 10000 - 10ffff  |  11110xx 10xxxxxx 10xxxxxx 10xxxxxx
Run Code Online (Sandbox Code Playgroud)

我正在玩其他可能的可变宽度编码,并发现通过使用以下方案,最多需要3个字节来存储所有Unicode.如果第一位是1,则字符被编码为至少一个字节(读取直到第一位为0).

 Range           |  Encoding
-----------------+-----------------
     0 - 7f      |  0xxxxxx
    80 - 407f    |  1xxxxxx 0xxxxxxx
  4080 - 20407f  |  1xxxxxx 1xxxxxxx 0xxxxxxx
Run Code Online (Sandbox Code Playgroud)

UTF-8中的连续位真的那么重要吗?第二种编码看起来效率更高.

And*_*eas 8

UTF-8是自我验证的,快速前进,更容易后退.

自我验证:由于序列中的第一个字节指定了长度,因此下一个X字节必须适合10xxxxxx,或者您的序列无效.单独查看10xxxxxx字节可立即识别为无效.
您建议的编码没有内置验证.

快速前进:如果必须跳过该字符,则可以立即跳过由第一个字节确定的X字节,而不必检查每个中间字节.

后退更容易:如果你必须向后读取字节,你可以立即识别连续字符10xxxxxx.然后,您就可以向后扫描过去10xxxxxx的字节11xxxxxx前导字节,而不必扫描过去的前导字节.

请参阅维基百科上的UTF-8无效字节序列.