• WindowsPhone的中文GB2312、GBK编码与Unicode相互转换


    网上有高人做的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编码。

  • 相关阅读:
    postman简单传参,上个接口的返回值作为下个接口的入参。
    python 给定URL 如何获取其内容,并将其保存至HTML文档。
    外键关联on_delete参数含义
    excel导入与导出
    序列化关系
    使用框架的各种代码示例
    国产celery简单使用
    selecte_related 函数优化查询
    django 之 配置文件
    类与缓存问题 类与属性的关系
  • 原文地址:https://www.cnblogs.com/605395451/p/2628750.html
Copyright © 2020-2023  润新知