对汉字字符的统计

以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无符号型来做统计。


(现就这样吧,等我回去补一下位运算再回来更。。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值