日期:2014-05-20  浏览次数:20725 次

Java基础问题:汉字问题深入谈

一、主题:关于JAVA的中文问题    
        JAVA的中文问题比较突出,主要表现在控制面板输出,JSP页面输出和数据库访问上。本文尽量避开字体问题,而只谈编码。通过本文,你可以了解JAVA中文问题的由来,问题的解决方法,其中提了一下用JDBC访问数据库的方法。    

二、问题描述:    
1)在中文W2000中文窗口编译和运行,用的是国际版的JDK,连接的是中文W2000下的Cp936编码的SQL   SERVER数据库:    

J:exercisedemoencodeHelloWorld> make    
      Created   by   XCompiler.   PhiloSoft   All   Rights   Reserved.    
      Wed   May   30   02:54:45   CST   2001    

J:exercisedemoencodeHelloWorld> run    
      Created   by   XRunner.   PhiloSoft   All   Rights   Reserved.    
      Wed   May   30   02:51:33   CST   2001    
中文    
[B@7bc8b569    
[B@7b08b569    
[B@7860b569    
中文    
中文    
????    
中文    
中文    
????    
??    
??    
??    

2)如果在中文W2000的西文窗口(编码为437)下编译,用JAVA运行则由于无字体而无法正常显示,如果象上面一样在中文W2000的中文窗口运行,输出为:    

J:exercisedemoencodeHelloWorld> run    
      Created   by   XRunner.   PhiloSoft   All   Rights   Reserved.    
      Wed   May   30   02:51:33   CST   2001    
????    
[B@7bc0b66a    
[B@7b04b66a    
[B@7818b66a    
????    
????    
????    
????    
????    
????    
中文    
中文    
????    

三)分析    

1)出现有乱码(也就是?)。由于只出现?而没出现小方框,说明只是编码有问题,而不是字体问题。   在编码中,如果从一种字符集转换到别一种字符集,比较典型的是从GB2312转换到ISO8859_1(即ASCII),那么很多汉字(半个汉字)是无法映射到西文字符中去的,在这种情形下,系统就把这些字符用?代替。同样,也存在小字符集无法到大字符集的情况,具体原因这里就不详谈了。    

2)出现了中文环境编译,中文环境运行时汉字显示有正确也有不正确的地方,同样,在西文环境下编译,在中文环境下运行时也出现类似情况。这是由于自动(默认)或手工(也就new   String(bytes[,encode])和bytes   getBytes([encode]))转码的结果。    

2.1)在JAVA源文件--> JAVAC--> Class--> Java--> getBytes()--> new   String()--> 显示的过程中,每一步都有编码的转换过程,这个过程总是存在的,只是有的时候用默认的参数进行。下面我们一步一步分析为什么出现上面的情形。    

2.2)这里是源代码:    

HelloWorld.java:    
------------------------    
public   class   HelloWorld    
{    
        public   static   void   main(String[]   argv)  
        {    
                try  
                {    
                        System.out.println( "1: "+ "中文 ");  
                        System.out.println( "2: "+ "中文 ".getBytes());  
                        System.out.println( "3: "+ "中文 ".getBytes( "GB2312 "));    
                        System.out.println( "4: "+ "中文 ".getBytes( "ISO8859_1 "));