萍聚社区-德国热线-德国实用信息网

 找回密码
 注册

微信登录

微信扫一扫,快速登录

萍聚头条

查看: 808|回复: 0

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

[复制链接]
发表于 2003-5-11 22:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册 微信登录

x
发信人: 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则都支持。

源程序:

  1. //: TestConv.java

  2. public class TestConv
  3. {
  4.     public static void main(String[] args)
  5.     {
  6.         String s = "123abc中学學";
  7.         String[] encodings = {
  8.             "UTF-8",
  9.             "GBK",
  10.             "GB2312",
  11.             "BIG5",
  12.             "ISO8859-1"
  13.         };
  14.         System.out.println("original String:" + s);

  15.         for (int i = 0; i < encodings.length; i++)
  16.         {
  17.             byte[] b = null;
  18.             try
  19.             {
  20.                 b = s.getBytes(encodings[i]);
  21.             }catch (Exception e)
  22.             {
  23.                 System.out.print(
  24.                     "error occur: encoding-"
  25.                     + encodings[i]
  26.                     + " message:"
  27.                     + e.getMessage()
  28.                     );
  29.             }

  30.             System.out.print(encodings[i] + ":\n\t");

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

  35.             System.out.println();
  36.         }
  37.     }
  38. }
复制代码


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

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


※ 修改:·cloudor 于 Nov 18 09:50:40 修改本文·[FROM:  218.17.206.116]
※ 来源:·BBS 水木清华站 smth.edu.cn·[FROM: 218.17.206.116]
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
您需要登录后才可以回帖 登录 | 注册 微信登录

本版积分规则

手机版|Archiver|AGB|Impressum|Datenschutzerklärung|萍聚社区-德国热线-德国实用信息网

GMT+1, 2025-2-7 13:08 , Processed in 0.062628 second(s), 16 queries , MemCached On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表