首页|操作系统|软件开发|网页制作|媒体动画|数据库|ASP教程|ASP.NET教程|PHP教程|JSP教程|XML教程|建站资料|软件学院|行业资讯|平面设计|网络安全|晒IT论坛|IT人才
  位置: 晒IT >> 软件开发 >> 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"));

            System.out.println("5:"+new String("中文".getBytes()));//5 
            System.out.println("6:"+new String("中文".getBytes(),"GB2312")); 
            System.out.println("7:"+new String("中文".getBytes(),"ISO8859_1"));

            System.out.println("8:"+new String("中文".getBytes("GB2312")));//8 
            System.out.println("9:"+new String("中文".getBytes("GB2312"),"GB2312"));
            System.out.println("10:"+new String("中文".getBytes("GB2312"),"ISO8859_1"));

            System.out.println("11:"+new String("中文".getBytes("ISO8859_1")));//11 
            System.out.println("12:"+new String("中文".getBytes("ISO8859_1"),"GB2312"));
            System.out.println("13:"+new String("中文".getBytes("ISO8859_1"),"ISO8859_1"));
        } 
        catch(Exception e)
        { 
            e.printStackTrace(); 
        } 
  } 


为了方便起见,在每个转换的后面加了操作序号,分别为1,2,...,13。 

2.3)需要说明的是,JAVAC是以系统默认编码读入源文件,然后按UNICODE进行编码的。在JAVA运行的时候,JAVA也是采用UNICODE编码的,并且默认输入和输出的都是操作系统的默认编码,也就是说在new String(bytes[,encode])中,系统认为输入的是编码为encode的字节流,换句话说,如果按encode来翻译bytes才能得到正确的结果,这个结果最后要在JAVA中保存,它还是要从这个encode转换成Unicode,也就是说有bytes-->encode字符-->Unicode字符的转换;而在String.getBytes([encode])中,系统要做一个Unicode字符-->encode字符-->bytes的转换。 
[1] [2]  下一页
  • 上一篇: int 和 String 互相转换的多种方法
  • 下一篇: 最新Java规范强化XML支持
  •  告诉好友  打印此文 关闭窗口 返回顶部
     
    热点文章
     
     
    推荐文章
     
     
    相关文章

    | 设为首页 | 加入收藏 | 联系我们 | 友情链接 | 诚聘英才 |
    Copyright© 2008 ShaiIT.Com .All Rights Reserved
    下载alexa工具,提升您的网站排名