文选流氓 发表于 2003-5-11 22:53

1-1-16-2-22 关于编码的思考

发信人: cloudor (大功即将告成!!!), 信区: Java
标题: Re: 关于编码的思考
发信站: BBS 水木清华站 (Mon Nov 18 08:50:51 2002), 转信


在java里,所有char和String都是用unicode/ucs保存的,
当数据读入时指定encoding,那么编译时进入class文件或者
运行时进入内存都会自动实现转换.

同理在输出时指定encoding也会实现转换.

但要注意的是,big5和gb2312的确有在unicode/ucs中同样
的字符,比如"他""什""中""台"等非常简单因此没有被简化
的汉字.而ISO8859-1和两者只有ascii部分有相同字符.一个
字符假如不在一个字符集中(反正不可能是unicode),那么编码
就会出错,就用"?"来表示.

文末范例程序在编译时(GB18030环境)将"123abc中学學"以unicode保存
在class文件中,运行时用"UTF-8""GB2312""GBK""BIG5""ISO8859-1"
输出相应encoding/charset里的字节.

结果如下:
========================
original String:123abc中学學
UTF-8:
      31 32 33 61 62 63 e4 b8 ad e5 ad a6 e5 ad b8
GBK:
      31 32 33 61 62 63 d6 d0 d1 a7 8c 57
GB2312:
      31 32 33 61 62 63 d6 d0 d1 a7 3f
BIG5:
      31 32 33 61 62 63 a4 a4 3f be c7
ISO8859-1:
      31 32 33 61 62 63 3f 3f 3f
========================
其中3f就是'?',中文字在ISO8859-1里不支持,而'学'字在big5里不支持,
'學'字在gb2312里不支持。
而UTF-8和GBK则都支持。

源程序:

//: TestConv.java

public class TestConv
{
    public static void main(String[] args)
    {
      String s = "123abc中学學";
      String[] encodings = {
            "UTF-8",
            "GBK",
            "GB2312",
            "BIG5",
            "ISO8859-1"
      };
      System.out.println("original String:" + s);

      for (int i = 0; i < encodings.length; i++)
      {
            byte[] b = null;
            try
            {
                b = s.getBytes(encodings);
            }catch (Exception e)
            {
                System.out.print(
                  "error occur: encoding-"
                  + encodings
                  + " message:"
                  + e.getMessage()
                  );
            }

            System.out.print(encodings + ":\n\t");

            for (int j = 0; j < b.length; j++)
            {
                System.out.print(Integer.toString((b+256)%256, 16) + " ");
            }

            System.out.println();
      }
    }
}


【 在 hello10000 (坦言) 的大作中提到: 】
: 我想弄清楚到底编码转换是怎么回事!
: 实现多种编码之间的转换我想最方便的就是采用一种中间编码,实现每种编码与这种中间
: 编码的转换就可以在任何两种编码之间转换了。比如不管iso-8859或者gbk或者big5只要
: 都有与unicode转换接口,肯定可以很轻松在任何两种编码之间转换。如下图
: big5--|
: gb2312-|<-->unicode
: iso8859-|
: 如果直接实现任何两种编码之间的转换工作量就大多了,是不是?
: java中编码转换是不是以unicode为桥梁进行的呢?这个到桥梁的转换是不是就是通过到?
: 节流的编码与解码实现的呢?而这种字节流在java处理中都是平台使用的编码地字节流,
: 又是如何充当桥梁作用的?
: ...................

--
上上下下浇着那条毛巾,然后,我打了个冷战.


※ 修改:·cloudor 于 Nov 18 09:50:40 修改本文·
※ 来源:·BBS 水木清华站 smth.edu.cn·
页: [1]
查看完整版本: 1-1-16-2-22 关于编码的思考