Java中文问题详解(转载与java-cn.net)

转载 2007年10月04日 21:40:00

我来说一下tomcat如何实现JSP的你就明白了。
预备知识:
 1.字节和unicode
  Java内核是unicode的,就连class文件也是,但是很多媒体,包括文件/流的保存方式
  是使用字节流的。 因此Java要对这些字节流经行转化。char是unicode的,而byte是字节.
  Java中byte/char互转的函数在sun.io的包中间有。其中ByteToCharConverter类是中调度,
  可以用来告诉你,你用的Convertor。其中两个很常用的静态函数是
   public static ByteToCharConverter getDefault() ;
   public static ByteToCharConverter getConverter(String encoding);
  如果你不指定converter,则系统会自动使用当前的Encoding,GB平台上用GBK,EN平台上用
  8859_1
  
  我们来就一个简单的例子:
     "你"的gb码是:0xC4E3 ,unicode是0x4F60
     你用:
     --encoding="gb2312";
     --byte b[]={(byte)u00c4,(byte)u00E3};
     --convertor=ByteToCharConverter.getConverter(encoding);
     --char [] c=converter.convertAll(b);
     --for(int i=0;i<c.length;c++)
     --{
     -- System.out.println(Integer.toHexString(c[i]));
     --}
     --打印出来是0x4F60
     --但是如果使用8859_1的编码,打印出来是
     --0x00C4,0x00E3
     ----例1
     反过来:
     --encoding="gb2312";
        char c[]={u4F60};
        convertor=ByteToCharConverter.getConverter(encoding);
     --byte [] b=converter.convertAll(c);
     --for(int i=0;i<b.length;c++)
     --{
     -- System.out.println(Integer.toHexString(b[i]));
     --}
      --打印出来是:0xC4,0xE3
      ----例2
      --如果用8859_1就是0x3F,?号,表示无法转化      --
      很多中文问题就是从这两个最简单的类派生出来的。而却有很多类  
  不直接支持把Encoding输入,这给我们带来诸多不便。很多程序难得用encoding
  了,直接用default的encoding,这就给我们移植带来了很多困难
  --
  2.UTF-8
  --UTF-8是和Unicode一一对应的,其实现很简单
  --
   -- 7位的Unicode: 0 _ _ _ _ _ _ _
  --11位的Unicode: 1 1 0 _ _ _ _ _ 1 0 _ _ _ _ _ _
  --16位的Unicode: 1 1 1 0 _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _
  --21位的Unicode: 1 1 1 1 0 _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _
  --大多数情况是只使用到16位以下的Unicode:
  --"你"的gb码是:0xC4E3 ,unicode是0x4F60
  --我们还是用上面的例子
  --  --例1:0xC4E3的二进制:
  --  --    1 1 0 0 0 1 0 0 1 1 1 0 0 0 1 1
  --  --    由于只有两位我们按照两位的编码来排,但是我们发现这行不通,
  --  --    因为第7位不是0因此,返回"?"
  --  --   
  --  --例2:0x4F60的二进制:
  --  --    0 1 0 0 1 1 1 1 0 1 1 0 0 0 0 0
  --  --    我们用UTF-8补齐,变成:
  --  --    11100100 10111101 10100000
  --  --    E4--BD-- A0
  --  --    于是返回0xE4,0xBD,0xA0
  --  --
  3.String和byte[]
  --String其实核心是char[],然而要把byte转化成String,必须经过编码。
  --String.length()其实就是char数组的长度,如果使用不同的编码,很可
  --能会错分,造成散字和乱码。
  --例:
  ----byte [] b={(byte)u00c4,(byte)u00e3};
  ----String str=new String(b,encoding);  ----
  ----如果encoding=8859_1,会有两个字,但是encoding=gb2312只有一个字  ----
  --这个问题在处理分页是经常发生
  4.Reader,Writer/InputStream,OutputStream
  --Reader和Writer核心是char,InputStream和OutputStream核心是byte。
  --但是Reader和Writer的主要目的是要把Char读/写InputStream/OutputStream
--一个reader的例子:
--文件test.txt只有一个"你"字,0xC4,0xE3--
--String encoding=;
--InputStreamReader reader=new InputStreamReader(
----new FileInputStream("text.txt"),encoding);
--char []c=new char[10];
--int length=reader.read(c);
--for(int i=0;i<c.length;i++)
----System.out.println(c[i]);
  --如果encoding是gb2312,则只有一个字符,如果encoding=8859_1,则有两个字符
  --------
--
--
  
   ----
 2.我们要对Java的编译器有所了解:
 --javac -encoding
  我们常常没有用到ENCODING这个参数。其实Encoding这个参数对于跨平台的操作是很重要的。
  如果没有指定Encoding,则按照系统的默认Encoding,gb平台上是gb2312,英文平台上是ISO8859_1。 
 --Java的编译器实际上是调用sun.tools.javac.Main的类,对文件进行编译,这个类 --
 有compile函数中间有一个encoding的变量,-encoding的参数其实直接传给encoding变量。
 编译器就是根据这个变量来读取java文件的,然后把用UTF-8形式编译成class文件。
 一个例子:
 --public void test()
 --{
 ----String str="你";
 ----FileWriter write=new FileWriter("test.txt");
 ----write.write(str);
 ----write.close();
 --}
 ----例3
--如果用gb2312编译,你会找到E4 BD A0的字段
--
--如果用8859_1编译,
--00C4 00E3的二进制:
--00000000 11000100 00000000 11100011--
--因为每个字符都大于7位,因此用11位编码:
--11000001 10000100 11000011 10100011
--C1-- 84-- C3--  A3
--你会找到C1 84 C3 A3 --
    
  但是我们往往忽略掉这个参数,因此这样往往会有跨平台的问题:
  --  例3在中文平台上编译,生成ZhClass
  --  例3在英文平台上编译,输出EnClass
  --1.  ZhClass在中文平台上执行OK,但是在英文平台上不行
  --2.  EnClass在英文平台上执行OK,但是在中文平台上不行
  原因:
 --1.在中文平台上编译后,其实str在运行态的char[]是0x4F60, ----
 --在中文平台上运行,FileWriter的缺省编码是gb2312,因此
 --CharToByteConverter会自动用调用gb2312的converter,把str转化  


 

[转载]java中文问题

转自:http://hi.baidu.com/daping%5Fzhang/blog/item/847243a7b832ce95d1435833.html真正接触过java,或者说曾经用java解决过...
  • zzjjzzgggg
  • zzjjzzgggg
  • 2008年05月26日 16:21
  • 849

Java中文问题详解

Java中文问题详解我来说一下tomcat如何实现JSP的你就明白了。 预备知识:  1.字节和unicode   Java内核是unicode的,就连class文件也是,但是很多媒体,包括文件/流的...
  • xiaoyou
  • xiaoyou
  • 2001年06月14日 15:31
  • 706

java中文问题详解

google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";...
  • java169
  • java169
  • 2008年05月21日 02:50
  • 115

java中文问题详解

java中文问题详解我来说一下tomcat如何实现jsp的你就明白了。 预备知识:  1.字节和unicode   java内核是unicode的,就连class文件也是,但是很多媒体,包括文件/流的...
  • gbopeng
  • gbopeng
  • 2004年10月27日 09:58
  • 511

php.ini 中文详解 [转载]

作者:金步国版权声明本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布。任何人都可以自由使用、转载、复制和再分发,但必须保留作者署名,亦不得对声明中的任何条款作任何形式的...
  • cn_ldx
  • cn_ldx
  • 2010年07月02日 00:06
  • 727

正式声明:转载本Blog文章请注明原始出处和作者

今天在网上搜索“提高测试效率”相关的文章。结果无意中发现有位仁兄几乎原封不动的抄袭了偶的一篇文章(RUP测试过程实践之测试需求与测试用例),而且做为自己的作品发布在其所属企业的内部网站上。偶对于这种版...
  • jackei
  • jackei
  • 2006年08月01日 16:19
  • 435

java中 中文问题详解

java中 中文问题详解转贴          作者:yuking 预备知识:    1.字节和unicode      Java内核是unicode的,就连class文件也是,但是很多媒体,包括文件...
  • eako
  • eako
  • 2005年04月18日 09:58
  • 792

读Tomcat与Java Web开发技术详解 笔记

第一章 1.1Web的概念: Web的具有以下3个特征: -用超级文本技术HTML来表达信息,以及建立信息与信息的链接。 -用统一资源定位技术URL来实现网络上信息的精确定位。 ...
  • u013769121
  • u013769121
  • 2016年05月25日 23:04
  • 1118

转载:Java中文问题详解,底层编码解剖

                        Java中文问题详解预备知识: 1.字节和unicode  Java内核是unicode的,就连class文件也是,但是很多媒体,包括文件/流的保存方式...
  • Victor518
  • Victor518
  • 2004年10月29日 09:27
  • 692

一键转载CSDN博客

前言  将喜欢的博客进行转载是对博客的收藏,也能够在以后不断的提高自己,而CSDN并没有一键转载功能,现在提供一种方法方便大家进行转载。实现   我们首先打开要转载的博客,然后鼠标右键就会出现下面的菜...
  • kevinelstri
  • kevinelstri
  • 2017年03月09日 13:38
  • 573
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java中文问题详解(转载与java-cn.net)
举报原因:
原因补充:

(最多只允许输入30个字)