对汉字字符的统计
2015-06-15 13:34
288 查看
以GB2312为标准,说一下我对汉字字符统计的一点认识。
ASCII码:一个字符占一个字节,以0开头;
中文字符:一个汉字占两个字节,以1开头。
ASCII码的161-255这中间94个字符很少用,所以用来作为中文字符的编码。但是中文汉字很多,远不止94个,所以我们用94*94=8836个足够来表示日常生活中常用的汉字。
对于汉字的统计,我一开始采用了以下的方法,比较简单易行,可以用来做要求不高汉字不难的简单统计,但是容易出Bug。
因为汉字从0xA0开始编码,其中0xA0即160,在其后包括有中文的标点符号,也算在汉字字符集中。所以我们可以直接考虑用
分别代表汉字的字节和对汉字的计数。
将读取到的汉字字节直接与0xA0作比较
但是要注意,汉字字符占俩字节阿,所以最后要
你以为这就完事儿了?怎么可能!
还有还有还有!!
我们木有考虑到一个问题:
如果所统计的目标文件里面有一些幺蛾子,它们不算是中文字符,但又占两个字节,而且两个字节中说不定满足有大于0xA0的。那如果是这样的话,我们的统计就又出错了,这就是我上面说的容易出Bug的原因。
下面我再介绍一种严谨的统计方法。
本文一开始说了,一个汉字占两个字节,都是以1开头的。所以我们可以考虑分别判断对于一个字符它的两个字节是否都是以1作为开头的,如果是则为中文字符。
因为1作为开头在最高位表示“负”,所以要用unsigned char无符号型来做统计。
(现就这样吧,等我回去补一下位运算再回来更。。)
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无符号型来做统计。
(现就这样吧,等我回去补一下位运算再回来更。。)
相关文章推荐
- Apache Hadoop安装部署
- [HDOJ2157]How many ways??
- (二)SDN 控制器 NOX 源码分析之—— Component
- Android批量图片加载经典系列——使用xutil框架缓存、异步加载网络图片
- poj 2263 Heavy Cargo(floyd)
- poj 2263 Heavy Cargo(floyd)
- JAVA实现的一个简单的Socket Server范例
- 04.ZooKeeper读书笔记之开源客户端(ZkClient)
- 游戏设计要素探秘之术语的呼唤
- 《人月神话》阅读笔记三
- oracle学习之路(五)-----oracle数据类型的一般操作
- socket技术详解(看清socket编程)
- Android 电量变化监听
- android学习笔记asyncTask的多线程异步通信
- HDU 5247 【学习SET使用】
- win32 单选按钮
- Xcode报 couldn’t be opened because you don’t have permission to view it
- Uva - 12657 - Boxes in a Line
- Uva - 12657 - Boxes in a Line
- 监控SharePoint效率之(一) –监控效率用到的工具