就以 '袁' 字为例吧,我想知道详细点的说明,是怎么把'袁'字转成gbk码的,
到底汉字和gbk之间是通过哪个算法算出来的,很不理解,一个是汉字,一个是一数数字。

解决方案 »

  1.   

    好像可以用ENCODINGE转一下再封装成一个新的字符串吧!!
      

  2.   

    没有算法,在 JRE 底层类库中各种字符集都有一个类,这些字符集类中映射了每个字符集中所有的字符。
      

  3.   

    这些类位于 sun.io.cs、sun.io.cs.ext 包中,属于 JRE 底层类库,源代码在 JDK 的 src 中没有,需要到
    Open JDK 上去下载 Open JDK 的源代码。GBK 编码的类为:sun.nio.cs.ext.GBK,这个类继承自 java.nio.charset.Charset 类所有的解码映射字符放在了其中的一个静态公开内部类中,这个类继承了 sun.nio.cs.ext.DoubleByteDecoder 类
    所有的编码映射字符放在了其中的一个静态公开内部类中,这个类继承了 sun.nio.cs.ext.DoubleByteEncoder 类解码工作由 DoubleByteDecoder 完成,编码工作由 DoubleByteEncoder 完成。DoubleByteDecoder 解码(由字节转为字符)主要方法:    protected char decodeDouble(int byte1, int byte2) {
            if (((byte1 < 0) || (byte1 > index1.length))
                || ((byte2 < start) || (byte2 > end)))
                return REPLACE_CHAR;        int n = (index1[byte1] & 0xf) * (end - start + 1) + (byte2 - start);
            return index2[index1[byte1] >> 4].charAt(n); 
        }其中的 index1、index2 是由其子类 GBK 中的继承自 DoubleByteDecoder 静态公开内部类实现的。
    DoubleByteEncoder 编码(由字符转为字节)主要方法:    protected int encodeDouble(char ch) {
            int offset = index1[((ch & 0xff00) >> 8 )] << 8;
            return index2[offset >> 12].charAt((offset & 0xfff) + (ch & 0xff));
        }同样,这其中的 index1、index2 也是由其子类 GBK 中的继承自 DoubleByteEncoder 静态公开内部类实现的。OpenJDK 6:
    http://download.java.net/openjdk/jdk6/ 下载 openjdk-6-src-b16-24_apr_2009.tar.gz,压缩包有 46.9MB,使用 WinRAR 等工具释放出来,可能需要一些时间,释放后大概有 254MB,那些个编码的源代码位于:jdk/src/share/classes/sun/nio/cs 目录中。
      

  4.   

    Java里有个API专干这事的啊,到命令行里转就OK