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