码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-03-11 10:59:37      阅读:406      评论:0      收藏:0      [点我收藏+]

标签:

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

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;

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

标签:

原文地址:http://blog.csdn.net/y601500359/article/details/44194175

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!