我正在尝试弄清楚UTF-8编码中的“连续字节”是什么(出于好奇心)。
维基百科在UTF-8文章中引入了这个术语,但没有给出任何定义。
谷歌搜索也没有返回有用的信息。我即将进入官方规范,但最好先阅读一个高层次的总结。
UTF-8中的续字节指的是前两位为10
的任意字节。
它们通常出现在多字节序列中,下表可以帮助理解:
Unicode code points 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
位开始的字节即可。
同样,也可以通过仅计算非10xxxxxx
字节来使用UTF-8 strlen
。
100
)的前缀。他们可能可以使用不同的方案,但他们选择的是我们现在拥有的方案,简单明了 :-) - paxdiablo0xxxxxxx
110xxxxx
10xxxxxx
(一个1字节字符,一个2字节字符),并且第二个字节被修改为 100xxxxx
,那么解码器仍然可以正确打印第一个字符。但在您的变体中,... - Sourav Kannantha B0xxxxxxx
0xxxxxxx
1xxxxxxx
(一个1字节字符,一个2字节字符),并且它的第二个字节被损坏为 1xxxxxxx
,那么现在解析器将错误地将其解析为全新的3字节字符,因此在这种情况下,您会因为单个字节错误而丢失2个字符。 - Sourav Kannantha Bx
的方式不同。请参见https://tools.ietf.org/html/rfc3629#section-3。 - tay10r“Continuation byte”不是一个术语,而是一个普通的英语单词和术语“byte”的组合。如果作为伪术语使用,可能会让读者感到困惑。
Unicode标准仅在一个地方使用了这个表达式,即第5章,第5.22条:“例如,考虑四字节UTF-8序列的前三个字节,后跟一个无法成为有效连续字节的字节:。” 在这种情况下,意思很清楚:它只是一个继续某些东西的字节,即一系列字节。
维基百科页面显然使用“continuation byte”来表示UTF-8编码中除字符编码的第一个字节以外的任何字节。