嵌入到多个系统编程时常常出现编码问题,特别是中文,并且对于国标GB2312来说,不像UTF-8那样可以用算法直接转为unicode(传说是这么说的,我也没试过),所以GB到Unicode只能是一对一的转换。
以前碰到过GB转为Unicode的难题,在网上找到了源码,我只是修改了一下查找的代码,将查找算法改为二分查找。
主要函数为:
unsigned int gb_uni(unsigned int gb_idx); // 传入一个汉字所对应的gb2312编码,返回该汉字的Unicode编码
GB编码简单分析:
比如“我”字的gb编码为0xCED2,unicode编码为0x6211,那么0x6211==gb_uni(0xCED2),在windows的文档里面,小于0x0a1,都是ansii编码,GB2312中每个汉字用双字节标识,比如“我”字,gb码为上位编码为0xFFFFFF62和下位编码为0xFFFFFF11,组合后为0x6211,所以一般分析中英文档,逐个字符判断,小于0x0a1则为ansii,大于,则为汉字的开始,需要预读取下一个字符来合成一个汉字的编码。
源代码 在这里(点击超链接即可):
在vim下
输入:set fdm=marker,查看会比较舒服
C/C++ GB2312转为Unicode的源码