汉字高地位字节判断

汉字在计算机中使用两个字节表示,不同意常见的ASCII码。这也就导致汉字处理的很多不便,通常要判断一个字节到底是高位还是低位。

在C++标准库中提供了解决这种问题的方法,_ismbslead、_ismbstrail。这两个函数位于<mbctype.h> 或<mbstring.h>头文件中。函数原型如下:
int _ismbslead( const unsigned char *string, const unsigned char *current );

int _ismbstrail( const unsigned char *string, const unsigned char *current );

其中:string表示字符串的开始指针或者是已知的前部字节

current则表示要测试的字节

_ismbslead 和_ismbstrail 返回-1时就表示该字节为开始或者结束字节,否则得话函数返回的是0.

The _ismbslead and _ismbstrail routines perform context-sensitive tests for multibyte-character string lead and trail bytes; they determine whether a given substring pointer points to a lead byte or a trail byte. _ismbslead and _ismbstrail are slower than their _ismbblead and _ismbbtrail counterparts because they take the string context into account.

(MSDN)

IsDBCSLeadByte是Windows提供的一个API函数,也可以实现类似的功能。该函数可以使用ANSI代码页判断一个字节是否为开始字节,即双字节字符集中的第一个字符。

—————–

GB2312/GBK用的是高位区码(GBK用扩展的区码)+高位位码拼成一个全角字(双字节),由于区码和位码都在128以上,并且没有可靠的算法分辩两个字节,需要准确搜索时,不能随便从中间定位,因为如果错开了一个字节,就会造成乱码,这样诸如二分法之类的算法都不灵了。
当然,如果用等宽的编码,比如UNICODE,或GB2312/GBK全汉字字符(英文和标点用全角汉字),就没有上面的问题,WINDOWS内部就用双字节的UNICODE,代价是资源消耗很大,而后一种所有字符都采用全角的情况很少见。
注:GBK是GB2312的扩展,而GB2312最大的问题之一,是区码的码位和位码规则完全一样,原始的GB2312区位,区是从1到94,位也是1到94,护展到机内码是区号+160,位号加160,各占一个字节,因此从理论上来说,在字符串内以字节为单位随机取一个字节开始,没有可靠的算法可以分辩出这个字节是区码还是位码,而它后面的字串也跟着不能确定,于是精确的搜索字串只能老老实实从第一个字节开始扫描,见到第一个128以上的字节就当成汉字的区位,从它开始定位两个一组解析,直到发现第一个ASCII码为止,于是以字节为单位转入ASCII的分析,直到发现一个大于128的字符……这种循环效率低下是肯定的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值