【问题标题】:UTF-8 & Unicode, what's with 0xC0 and 0x80?UTF-8 和 Unicode,0xC0 和 0x80 是什么?
【发布时间】:2011-04-24 02:47:21
【问题描述】:

在过去的几天里,我一直在阅读有关 Unicode 和 UTF-8 的文章,并且经常遇到类似于此的按位比较:

int strlen_utf8(char *s) 
{
  int i = 0, j = 0;
  while (s[i]) 
  {
    if ((s[i] & 0xc0) != 0x80) j++;
    i++;
  }
  return j;
}

有人可以澄清与 0xc0 的比较并检查它是否是最重要的位吗?

谢谢!

编辑:与,而不是比较,使用了错误的词;)

【问题讨论】:

    标签: unicode utf-8


    【解决方案1】:

    这不是与0xc0 的比较,而是与0xc0 的逻辑与运算。

    位掩码0xc011 00 00 00,所以AND 所做的只是提取前两位:

        ab cd ef gh
    AND 11 00 00 00
        -- -- -- --
      = ab 00 00 00
    

    然后将其与0x80(二进制10 00 00 00)进行比较。换句话说,if 语句正在检查值的前两位是否不等于10

    “为什么?”,我听到你在问。嗯,这是个好问题。答案是,在 UTF-8 中,所有以位模式10 开头的字节都是多字节序列的后续字节:

                        UTF-8
    Range              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
    

    所以,这个小 sn-p 正在做的是遍历 UTF-8 字符串的每个字节,并计算所有不是连续字节的字节(即,它正在获取字符串的长度,如广告所示) .请参阅this wikipedia link 了解更多详情,Joel Spolsky's excellent article 了解入门知识。


    顺便说一句,很有趣。您可以按如下方式对 UTF-8 流中的字节进行分类:

    • 高位设置为0,它是一个单字节值。
    • 两个高位设置为10,它是一个连续字节。
    • 否则,它是多字节序列的第一个字节,前导1位的数量表示该序列总共有多少字节(110...表示两个字节,1110...表示三个字节,等)。

    【讨论】:

      猜你喜欢
      • 2011-04-26
      • 2011-01-23
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 2013-08-27
      • 2014-08-21
      • 2015-04-29
      • 1970-01-01
      相关资源
      最近更新 更多