首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >UTF-8和Unicode,0xC0和0x80是什么?

UTF-8和Unicode,0xC0和0x80是什么?
EN

Stack Overflow用户
提问于 2010-10-12 11:42:45
回答 1查看 28.6K关注 0票数 55

在过去的几天里,我一直在阅读关于Unicode和UTF-8的文章,我经常遇到类似于下面这样的逐位比较:

代码语言:javascript
运行
复制
int strlen_utf8(char *s) 
{
  int i = 0, j = 0;
  while (s[i]) 
  {
    if ((s[i] & 0xc0) != 0x80) j++;
    i++;
  }
  return j;
}

谁能澄清一下与0xc0的比较,并检查它是否是最重要的位?

谢谢!

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-10-12 11:51:45

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

位掩码0xc011 00 00 00,所以和所做的是只提取最高的两位:

代码语言:javascript
运行
复制
    ab cd ef gh
AND 11 00 00 00
    -- -- -- --
  = ab 00 00 00

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

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

代码语言:javascript
运行
复制
                    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

所以,这个小代码段所做的就是遍历UTF-8字符串的每个字节,并对不是连续字节的所有字节进行计数(即,它将获得字符串的长度,如广告所示)。有关更多详细信息,请参阅this wikipedia link,有关入门知识,请参阅Joel Spolsky's excellent article

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

高位设置为0

  • ,它是单字节值。将两个高位设置为10
  • ,它是多字节序列的第一个字节,前导1位的数量表示此序列总共有多少个字节(110...表示两个字节,1110...表示三个字节等)。
票数 103
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3911536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档