【问题标题】:UTF-8 Continuation bytesUTF-8 连续字节
【发布时间】:2012-03-10 12:01:10
【问题描述】:

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

维基百科在UTF-8 article 中引入了这个术语,根本没有定义它

Google 搜索也没有返回有用的信息。我即将进入官方规范,但最好先阅读高级摘要。

【问题讨论】:

  • 看起来有人刚刚编辑了维基百科的文章。 (:

标签: unicode utf-8


【解决方案1】:

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有两个字节,@987654327 @ 有三个,11110xxx 有四个)。
  3. 如果以10 开头,则为连续字节。

这种区别允许非常方便的处理,例如能够从序列中的任何字节备份以找到该代码点的第一个字节。只需向后搜索,直到找到一个不以 10 位开头的位置。

同样,它也可以用于 UTF-8 strlen,只计算非10xxxxxx 字节。

【讨论】:

  • 我认为这有点牵强/过于宽泛......无论如何,它包含有用的信息!但我无法理解的是,为什么需要11。可以说前导字节以0 开头,后续字节(可以任意多个)以1 开头。
  • @ΈρικΚωνσταντόπουλος "前导字节以 0 开头" -- 这是不正确的。以0 开头的字节是单字节代码点,因此它既不是前导 字节也不是延续。它是孤独的。这就是它与以 11 开头的字节不同的原因,后者表明它是 sequence 的第一个字节,为了表示单个代码点,预计后面会有更多字节。
  • @WilliamPrice 不知道为什么我发布了这个离题的评论,但我认为是我试图发明自己的编码。
  • 你说110xxxx有2个字节,1110xxxx有3个,11110xxx有4个。不应该是另一种方式吗? 010 代表 2,011 代表 3,100 代表 4?如果不是,为什么不用二进制代码?
  • @Cornelius:不,您给出的位模式是二进制 values 表示 2、3 和 4,但这与 UTF-8 编码无关.如果第一个字节以110 开头,则有一个连续字节。如果它以1110 开头,则有两个连续字节。 11110 同上,具有三个连续字节。考虑第一个字节的 first 位来决定它是否是多字节(如果1)或不是(如果0)可能会有所帮助。然后是连续的1之后 的数量,即 (1-3) 之后的连续字节数。
【解决方案2】:

“连续字节”不是一个术语,而是一个普通的英文单词和术语“字节”。如果用作伪术语,可能会使读者感到困惑。

Unicode 标准仅在一个地方使用此表达式,Ch. 5,第 5.22 条:“例如,考虑四字节 UTF-8 序列的前三个字节,后跟一个不能作为有效延续的字节字节:。”在这种情况下,含义很明确:它只是一个字节,延续了某事,即一个字节序列。

维基百科页面显然使用“连续字节”来表示 UTF-8 编码中的任何字节,除了字符编码形式的第一个字节。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    猜你喜欢
    • 2017-11-02
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 2022-12-28
    • 2023-01-30
    • 2014-12-24
    相关资源
    最近更新 更多