在代码里常看到这句话:

if (*str & 0x80)

…;

作用就是判断是否为汉字。

仔细研究了下,发现跟编码有关,具体也不想在这片blog里介绍了,而且也一知半解。

先看下二进制和10进制表示:

0x80=1000 0000 = 128

我们知道ASCII码是0~127,表示了全部的英文字符,因此只用小于0x80的数字就可以全部表示了。而汉字在unicode里却不在ASCII里。

Unicode用一个2字节数字表示每个字符,从0到65535。每个 2 字节数字表示至少在一种世界语言中使用的一个唯一字符。(在多种语言中都使用的字符具有相同的数字码。)这样就确保每个字符一个数字,并且每个数字一个字符。Unicode数据永远不会模棱两可。Unicode使用相同的数字表示ASCII和ISO-8859-1中的字符。只是这两种编码用一个字节表示,而Unicode用两个字节表示。所以Unicode表示这两种编码的字符时只要用低字节就可以了,高字节为0。

具体看下代码:

#include <iostream>
using namespace std;

unsigned int strLenEx(char *s)
{
    unsigned int strLen = 0;
    char *start = s;

    while (*start!='\0') {
        if (*start & 0x80)
            start += 2;
        else 
            start++;
        strLen++;
    }

    return strLen;
}

int main()
{
    cout << strLenEx("AB测试CDEF") << endl;

    return 0;
}
不知道会不会因为编辑器的不同而产生差别,对于有汉字的字符串,我这里必须要这么计算才能得到字符串的准确字符个数。