转载:http://blog.sina.com.cn/s/blog_7c4f3b160101dv4p.html

一个字符串长度统计的代码,如下

int calcLen(const char* _str)
{
        ;
        ;
        while ((ch = *_str))
        {
            CC_BREAK_IF(! ch);
            if (0x80 != (0xC0 & ch))
            {
                ++n;
            }
            ++_str;
        }
        return n;
}    
 
其中关于0x80 != (0xC0 & ch)的判断, 百思不得其解,按照ansi表的标准解释来看, 0~127位足以表达对字符数目的统计,也就是说用如下代码
(0x80 & ch) == 0 足以判断这个ch是不是一个字符, 因此那种复杂的写法理论上不只是做ansi字符的判断。
 
0xC0也就是1100, 这个&运算判断的是下一个ch的头两位是什么字符, 因为11能完全反映出本来的数字
对于普通的ansi字符(非扩展集)而言, 他的头一位一定是0(0000 0000 ~ 0111 1111)
对于UTF-8字符而言, 因为UTF-8编码是一种多字节序的形式, 他采用如下的数字序规律
 
所有10打头的在UTF-8里面, 表示都是一个多字节序的子序
 
两个UTF-8字符, 打头则是以110开始, 后面跟10XXXXXX, 10YYYYYY表示接下来的字符
三个则是1110开始, 后面跟三个10XXXXXX来表示字符
 
所以在计算字符串个数的时候, 只需要判断当前字符是不是等于10开头,不等于10开头就一定是一个单字符或者一个多字符, 然后计数器+1即可
 
具体有兴趣的童鞋可参阅http://stackoverflow.com/questions/3911536/utf-8-unicode-whats-with-0xc0-and-0x80
 

UTF-8&Unicode,0xC0和0x80是什么?的更多相关文章

  1. Unicode 与 Unicode Transformation Format(UTF,UTF-8 / UTF-16 / UTF-32)

    ASCII(American Standard Code for Information Interchange):早期它使用7 bits来表示一个字符,总共表示27 = 128个字符:后来扩展到8 ...

  2. Unicode和UTF的关系

    目录结构: contents structure [+] 什么是USC UCS的编码方式 Unicode的来源 为什么需要Unicode Unicode的方式 Unicode和UTF UTF和Unic ...

  3. ASCII UNICODE UTF "口水文"

    最近接了一个单是需要把非 UTF-8 (No BOM)编码的文件转换成 UTF-8 (No BOM),若此文件是 UTF-8 但带有 BOM ,需要转换成不带 BOM 的.于是开启了一天的阅读.首先花 ...

  4. 转:Unicode字符集和多字节字符集关系

    原文地址: http://my.oschina.net/alphajay/blog/5691 unicode.ucs-2.ucs-4.utf-16.utf-32.utf-8 http://stallm ...

  5. 【JAVA编码专题】JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础

    这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...

  6. 2.数码相框-编码(ASCII/GB2312/Unicode)介绍,并使LCD显示汉字字符(2)

    在上章-学习了数码相框的框架分析(1)了 本章主要内容如下: 1)熟悉ASCII/GB2312/Unicode编码 2)写应用程序,使LCD显示汉字和字符 大家都知道,数据传输的是二进制,而字符和汉字 ...

  7. Unicode,GBK,GB2312,UTF-8概念基础(转载)

    第一篇:JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础本部分采用重用,转载一篇文章来完成这部分的目标.来源:holen'blog   对字符编码与Unicode,IS ...

  8. Unicode字符集和多字节字符集关系

      在计算机中字符通常并不是保存为图像,每个字符都是使用一个编码来表示的,而每个字符究竟使用哪个编码代表,要取决于使用哪个字符集(charset). 在最初的时候,Internet上只有一种字符集—— ...

  9. JAVA字符编码一:Unicode,GBK,GB2312,UTF-8概念基础

    第一篇:JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础 来源:holen'blog   对字符编码与Unicode,ISO 10646,UCS,UTF8,UTF16, ...

随机推荐

  1. Error:(18, 51) java: -source 1.5 中不支持 diamond 运算符 (请使用 -source 7 或更高版本以启用 diamond 运算符)

    问题:主要是因为jdk版本不一样 解决: 方法一:List<String> list=new ArrayList<Stirng>(); 方法二:重新安装jdk8的版本(安装和配 ...

  2. oracle 存储过程详细介绍(创建,删除存储过程,参数传递等)

    这篇文章主要介绍了oracle 创建,删除存储过程,参数传递,创建,删除存储函数,存储过程和函数的查看,包,系统包等相关资料,需要的朋友可以参考下   oracle 创建,删除存储过程,参数传递,创建 ...

  3. ubuntu 安装 svn

    sudo apt-get install subversion

  4. STM32 MDK摘记

    题记:这人是越懒越懒,记性也也来越差,前段时间改了个链接文件,今天想用,竟然忘了咋写....还是勤记记吧... 随时更新,笔记帖. 不喜勿喷! 1,关于MDK链接文件宏的定义 #! armcc -E ...

  5. git的基本使用流程

    1. 在远端创建代码仓库 2. 拉取到本地 git clone $(path) #其中,path包括git路径或者https路径,可通过实际情况进行拉取.另外,可通过-b参数指定拉取的分支,默认拉取m ...

  6. go方法

    go中的方法(method),跟函数(function)不是一个概念,一定要区分,它的概念与python中的类方法类似. go中是没有类的概念的,所以,go要想实现类 多种属性集合的功能的话,必须要使 ...

  7. RabbitMQ基础命令rabbitmqctl

    官网文档 https://www.rabbitmq.com/rabbitmqctl.8.html 一般操作命令后台管理页面都有的,部分没有(应用程序管理,和集群管理). 直接使用命令,必须配置环境变量 ...

  8. linux查看系统未被挂载的磁盘空间的方法

    原文URL:https://www.cnblogs.com/lemon-flm/p/7597403.html 解决AWS 挂载.解决挂载完重启就消失等问题 linux上的盘和window的有区别,磁盘 ...

  9. 多线程面试题之【三线程按顺序交替打印ABC的方法】

    建立三个线程,线程名字分别为:A.B.C,要求三个线程分别打印自己的线程名字,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印.打印10轮,打印完毕控制台输出字符串:&q ...

  10. Git config 使用说明(转)

    原文:https://blog.csdn.net/gdutxiaoxu/article/details/79253737