zoukankan      html  css  js  c++  java
  • 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编码。

  • 相关阅读:
    升级windows 11小工具
    windows 10更新升级方法
    您需要了解的有关 Oracle 数据库修补的所有信息
    Step by Step Apply Rolling PSU Patch In Oracle Database 12c RAC Environment
    Upgrade Oracle Database Manually from 12.2.0.1 to 19c
    如何应用版本更新 12.2.0.1.210420(补丁 32507738 – 2021 年 4 月 RU)
    xtrabackup 安装、备份和恢复
    Centos_Lvm expand capacity without restarting CentOS
    Centos_Lvm_Create pv vg lv and mount
    通过全备+relaylog同步恢复被drop的库或表
  • 原文地址:https://www.cnblogs.com/605395451/p/2628750.html
Copyright © 2011-2022 走看看