以GB2312为标准,说一下我对汉字字符统计的一点认识。
ASCII码:一个字符占一个字节,以0开头;
中文字符:一个汉字占两个字节,以1开头。
ASCII码的161-255这中间94个字符很少用,所以用来作为中文字符的编码。但是中文汉字很多,远不止94个,所以我们用94*94=8836个足够来表示日常生活中常用的汉字。
对于汉字的统计,我一开始采用了以下的方法,比较简单易行,可以用来做要求不高汉字不难的简单统计,但是容易出Bug。
因为汉字从0xA0开始编码,其中0xA0即160,在其后包括有中文的标点符号,也算在汉字字符集中。所以我们可以直接考虑用
int ch,count=0;
分别代表汉字的字节和对汉字的计数。
将读取到的汉字字节直接与0xA0作比较
if (ch>0xA0)
count++;
但是要注意,汉字字符占俩字节阿,所以最后要
count/=2;
你以为这就完事儿了?怎么可能!
还有还有还有!!
我们木有考虑到一个问题:
如果所统计的目标文件里面有一些幺蛾子,它们不算是中文字符,但又占两个字节,而且两个字节中说不定满足有大于0xA0的。那如果是这样的话,我们的统计就又出错了,这就是我上面说的容易出Bug的原因。
下面我再介绍一种严谨的统计方法。
本文一开始说了,一个汉字占两个字节,都是以1开头的。所以我们可以考虑分别判断对于一个字符它的两个字节是否都是以1作为开头的,如果是则为中文字符。
因为1作为开头在最高位表示“负”,所以要用unsigned char无符号型来做统计。
(现就这样吧,等我回去补一下位运算再回来更。。)