• C++搜索字符串中的汉字


    示例:返回输入字符串中汉字的个数:

    int GetChineseCharacterCount(char *pStr)
    
    {
        int retCnt = 0;
        int i=0;
        while(pStr[i]!=0)
        {
            if(pStr[i] & 0x80)
            {
                retCnt++;
                i++;    // 因为一个汉字两个字节
            }
            i++;
        }
        return retCnt;
    
    
    
    }

    以下收自:

    http://blog.163.com/qin_kexin@126/blog/static/791554782011523103550237/

    ord($str)&0x80来判断汉字 

    80对应的二进制代码为1000   0000,最高位为一,代表汉字.汉字编码格式通称为10格式.  
      一个汉字占2字节,但只代表一个字符

    "Windows中,中文简体字符集的编码是同时用1个字节和2个字节来表示的。当高位是0x00~0x7f时,为一个字节,高位为0x80以上时用2个字节表示"

    注:括号里面都是2进制

    当你发现一个字节的内容大于0x7f,那它肯定是个(跟另外一个字节拼凑成一个)汉字,如何判断肯定大于0x7f呢?
    0x7f(1111111)后面一个数就是0x80(10000000),所以想要大于0x7f,这个字节的最高位都肯定是1,我们只需要判断这个最高位是否为1就行了。

    判断方法:
    位与(相同的位都是1的才为1,否则为0):
    如:要判断一个数的第三位是否是1,只要跟4(100)位与,判断一个数的第2位是否为1就跟2(10)位与.
    同理判断第八位是否为1只要跟(10000000)也就是0x80位与了.

    这里为什么不用>0x7f?php可能还行,但在其他强类型语言里面,1个字节的最高位用来标示负数,一个负数肯定不可能大于0x7f(最大的整数)


    再举个例子:
    a的assic码是97(1100001)
    A的assic码是65(1000001)

    b的assic码是98(1100010)
    B的assic码是66(1000010)

    发现一个规律:一个a-z的字母,只要是小写字母,第六位肯定是1,我们可以用这个来判断大小写:
    这时候只要跟用以个字母跟0x20(100000)来位与判断:
    if(ord($a)&0x20){
            //大写
    }

    如何把所有字母改成大写?第六位的1改成0就行了: 
    $a='a';
    $a        = chr(ord($a)&(~0x20));
    echo $a;

  • 相关阅读:
    iptables防火墙--------基本操作
    iptables防火墙--------基本概念
    常用运维工具小结
    ELK6.6.0+filebeat6.6.0部署
    Yum安装时出现 The program yum-complete-transaction is found in the yum-utils package
    重温面向对象核心 下 : 你一定能看懂的委托和事件
    重温面向对象核心 上
    程序员创业第一步:如何获取第一笔风险投资
    MVC + EFCore 完整教程19-- 最简方法读取json配置:自定义configuration读取配置文件
    MVC+EFCore 完整教程18 -- 升级分布视图至 View Component
  • 原文地址:https://www.cnblogs.com/SunkingYang/p/11049215.html
Copyright © 2020-2023  润新知