UTF-8连续字节

32

我正在尝试弄清楚UTF-8编码中的“连续字节”是什么(出于好奇心)。

维基百科在UTF-8文章中引入了这个术语,但没有给出任何定义。

谷歌搜索也没有返回有用的信息。我即将进入官方规范,但最好先阅读一个高层次的总结。


看起来有人刚刚编辑了维基百科的文章。(: - tripleee
3个回答

57

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多字节字节序列以及它们的二进制值。

基本规则如下:

  1. 如果一个字节以0位开始,则它是小于128的单字节值。
  2. 如果以11开始,则它是多字节序列的第一个字节,开头的1位数表示总共有多少字节(110xxxxx为两个字节,1110xxxx为三个字节,11110xxx为四个字节)。
  3. 如果以10开始,则它是一个连续字节。

这种区分使得处理非常方便,例如能够从序列中的任意字节回退,以查找该代码点的第一个字节。只需向后搜索,直到找到不以10位开始的字节即可。

同样,也可以通过仅计算非10xxxxxx字节来使用UTF-8 strlen


@WilliamPrice 不知道为什么我发了那个离题的评论,但我想那是我试图发明自己的编码方式。 - EKons
@Cornelius,我不知道他们为什么那样做,但我知道你提出的方案行不通。保持向后兼容7位ASCII非常重要,因此它们只能使用设置了最高位的字节。这意味着没有小于四(100)的前缀。他们可能可以使用不同的方案,但他们选择的是我们现在拥有的方案,简单明了 :-) - paxdiablo
哦,我现在明白了,但是只有当我想到你说的相反的时候 :) 这更像是一种向后不兼容或者不明确。如果你遇到以1开头的字节行,那就是Unicode。如果是0(在UTF-8中),那实际上是ASCII。 - Cornelius
@EKons 支持现有的UTF8编码方案的一个理由是,如果发生错误并且某些字节被损坏,那么未受影响的字符仍将保持其正确的含义。假设我发送 0xxxxxxx 110xxxxx 10xxxxxx(一个1字节字符,一个2字节字符),并且第二个字节被修改为 100xxxxx,那么解码器仍然可以正确打印第一个字符。但在您的变体中,... - Sourav Kannantha B
@EKons .... 如果我发送 0xxxxxxx 0xxxxxxx 1xxxxxxx(一个1字节字符,一个2字节字符),并且它的第二个字节被损坏为 1xxxxxxx,那么现在解析器将错误地将其解析为全新的3字节字符,因此在这种情况下,您会因为单个字节错误而丢失2个字符。 - Sourav Kannantha B
显示剩余6条评论

1
简而言之,连续字节是除第一个字节或单个字节外的字节。在UTF-8中,连续字节以0x10开头。

我认为你的意思是0b10000000,也就是0x80(相关部分是前两位)。规范中使用x的方式不同。请参见https://tools.ietf.org/html/rfc3629#section-3。 - tay10r

-4

“Continuation byte”不是一个术语,而是一个普通的英语单词和术语“byte”的组合。如果作为伪术语使用,可能会让读者感到困惑。

Unicode标准仅在一个地方使用了这个表达式,即第5章,第5.22条:“例如,考虑四字节UTF-8序列的前三个字节,后跟一个无法成为有效连续字节的字节:。” 在这种情况下,意思很清楚:它只是一个继续某些东西的字节,即一系列字节。

维基百科页面显然使用“continuation byte”来表示UTF-8编码中除字符编码的第一个字节以外的任何字节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接