网上有高人做的GB2312与Unicode相互转换的类或者程序集,大家去找找看。但是GB2312是比较老的标准,覆盖汉字6763个和非汉字图形字符682个。不是太够用,只能用GBK(覆盖汉字21003个、符号883个)。但找了老半天,网上没有现成的GBK与Unicode相互转换的程序集。遂,只能自己写了,现无私分享给大家。
思路:首先明确一点:Unicode只兼容ASCII码。所以,没有任何算法函数能表示GBK和Unicode的相互关系。那怎么办嘞?操作系统不是可以转换么?它是用得什么办法。就是最蛋疼的查表法。说的明白一点GBK转Unicode就是用数组的下标表示GBK的编码,用数组的值表示Unicode的编码。这就一一对应了。反之Unicode转GBK亦然,大家自己去思考。
一.GBK编码是双字节(16bit),也就是说能表示2的16次方(65535)个编码,而GBK的所覆盖的字符只有21886。做简单的方法就是弄个65535大小的数组,其中零零散散地分布着21886个有效GBK字符编码,这太浪费资源了。需进行适当优化。
接下来,请看,GBK中第一个中文字符编码为十六进制0x8140,最后一个编码为0xFEFE。0xFEFE-0x8140+0x0001=0x7DBF=32191。好了,缩减了区间,大约就是大小为32191的数组零零散散的分布着21886个有效GBK字符编码。所需空间减少了一半。但是还浪费了大约10000左右的空间,但是没办法了GBK编码太零散了。优化到这一步GBK转Unicode编码就完啦。
二.Unicode编码也是双字节,首先,Unicode编码只兼容ASCII编码,与其他编码完全不兼容。且,Unicode编码中把中文简体、繁体、日语、韩语列在同一大块区域。没有规律。完全找不到Unicode中文字符和GBK中文字符之间的函数映射。遂,也只能用查表法。
最简单的像上文那样弄个大小为65535的数组,当然也是浪费空间,也需要优化。GBK中的那些中文字符零散地分布在Unicode编码中6大块区域
。分别为
//0x00A4--0x0451 942 个编码位零散分布着157 个Unicode编码的中文字符
//0x2010--0x2642 1587 个编码位零散分布着289 个Unicode编码的中文字符
//0x3000--0x33D5 982 个编码位零散分布着270 个Unicode编码的中文字符
//0x4E00--0x9FA5 20902个编码位零散分布着20902个Unicode编码的中文字符
//0xE7C7--0xE864 158 个编码位零散分布着95 个Unicode编码的中文字符
//0xF92C--0xFFE5 1722 个编码位零散分布着173 个Unicode编码的中文字符
大家自己计算一下,这样一优化下来,只需要一个大小为26293的数组零散地分布着21886个有效中文字符。
下载: GBK与Unicode互换
文件在上面的链接里,大家要是想拿去项目中用的话,那需要注意GBKToUnicode.txt和UnicodeToGBK.txt的路径。
还有一点,我的代码是在开发WindowsPhone的基础上写的。其中加载文件的代码在其他平台不适用。
貌似转换性能也不太好,以后在优化。
至于说到GB2312与Unicode之间的相互转换,GBK编码向下兼容GB2312编码。