首页 > 开发 > 综合 > 正文

教你制作GBK与Unicode的对照表

2024-07-21 02:14:31
字体:
来源:转载
供稿:网友

  前段时间,在所参与的项目中遇到了一个unicode与gb之间转码失败的问题,一些不常用汉字的编码都被转成了“??”,这些汉字没有显示出来,于是自己对相关的问题做了一些研究并最终使问题得以解决。现在就结合前面两篇的unicode与gb方面的基本原理,介绍这种制作gbk-unicode编码对照表的方法。

  java的字符串string类功能强大,不但能进行一些基本的字符串操作,还可以根据需要构造指定字符集的字符串,本文所介绍的方法正是利了这一点,这种方法的基本思路是:

  1、遍历gbk编码表中的所有汉字,使用该字的gb编码构造一个字符串。gbk编码表中各部分的汉字分块比较整齐,很容易遍历。

  2、使用getbytes()方法取得该字符的字节数组,由于java是用unicode来表示字符的,所以此汉字的unicode就在其中。

  以下是一段示例代码:

{
    int count = 0;
    for(int segindex=0xb0; segindex<=0xf7; segindex++) {
        for(int charindex=0xa1; charindex<=0xfe; charindex++) {
            byte [] gbkbytes = new byte[] {(byte)(segindex), (byte)charindex};
            byte [] unicodebytes;
            string str = new string(gbkbytes,"gbk");
                
            unicodebytes = str.getbytes("unicode");
            if(unicodebytes.length == 4) {
                count++;
                string buffer = "";
                for (int i=0;i<gbkbytes.length;i++)
                    buffer += (int)(0x00ff&gbkbytes[i]) + " ";
                for (int i=3;i>1;i--)
                    buffer += (int)(0x00ff&unicodebytes[i]) + " ";
                buffer += " ";
                osw.write(buffer);
            }
        }
    }
}

   这一段是对gbk/2区的汉字进行遍历并处理的代码,gbk/2区的首字节范围在[0xb0,0xf7],尾字节范围在[0xa1,0xfe],在构造字符串时使用的字符集为gbk:

string str = new string(gbkbytes,"gbk");

  在使用getbytes()取得的字节数组中会有四个元素,前两个不知是做什么用的,可能与字符串本身的结构有关,接下来的两个字节才是真正的unicode码。但这两个字节是倒序的,要从最后一个字节开始取,之所以这样是与big_endian和little_endian有关的,这里不多说。

  当每一次内层循环结束时,buffer字符串中前两个数字就是一个gb码,后面两个数字就是一个unicode码,把它写到文件中就行了。

  这样的文件得到之后,再在另外的程序中载入文件,把unicode值装入数组,以gb码为索引,就可以很方便地由gb码查得unicode码。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表