【发布时间】:2012-03-10 12:01:10
【问题描述】:
我试图弄清楚 UTF-8 编码中的“连续字节”是什么(出于好奇)。
维基百科在UTF-8 article 中引入了这个术语,根本没有定义它
Google 搜索也没有返回有用的信息。我即将进入官方规范,但最好先阅读高级摘要。
【问题讨论】:
-
看起来有人刚刚编辑了维基百科的文章。 (:
我试图弄清楚 UTF-8 编码中的“连续字节”是什么(出于好奇)。
维基百科在UTF-8 article 中引入了这个术语,根本没有定义它
Google 搜索也没有返回有用的信息。我即将进入官方规范,但最好先阅读高级摘要。
【问题讨论】:
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有两个字节,@987654327 @ 有三个,11110xxx 有四个)。10 开头,则为连续字节。这种区别允许非常方便的处理,例如能够从序列中的任何字节备份以找到该代码点的第一个字节。只需向后搜索,直到找到一个不以 10 位开头的位置。
同样,它也可以用于 UTF-8 strlen,只计算非10xxxxxx 字节。
【讨论】:
11。可以说前导字节以0 开头,后续字节(可以任意多个)以1 开头。
0 开头" -- 这是不正确的。以0 开头的字节是单字节代码点,因此它既不是前导 字节也不是延续。它是孤独的。这就是它与以 11 开头的字节不同的原因,后者表明它是 sequence 的第一个字节,为了表示单个代码点,预计后面会有更多字节。
110 开头,则有一个连续字节。如果它以1110 开头,则有两个连续字节。 11110 同上,具有三个连续字节。考虑第一个字节的 first 位来决定它是否是多字节(如果1)或不是(如果0)可能会有所帮助。然后是连续的1 位之后 的数量,即 (1-3) 之后的连续字节数。
“连续字节”不是一个术语,而是一个普通的英文单词和术语“字节”。如果用作伪术语,可能会使读者感到困惑。
Unicode 标准仅在一个地方使用此表达式,Ch. 5,第 5.22 条:“例如,考虑四字节 UTF-8 序列的前三个字节,后跟一个不能作为有效延续的字节字节:。”在这种情况下,含义很明确:它只是一个字节,延续了某事,即一个字节序列。
维基百科页面显然使用“连续字节”来表示 UTF-8 编码中的任何字节,除了字符编码形式的第一个字节。
【讨论】:
简而言之,连续字节是除第一个字节或单个字节之外的字节。在 UTF-8 中,连续字节以 0x10 开头。
【讨论】:
x。见tools.ietf.org/html/rfc3629#section-3