java-汉字问题深入谈

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

一、主题:关于Java的中文问题

JAVA的中文问题比较突出,主要表现在控制面板输出,jsp页面输出和数据库访问上。

本文尽量避开字体问题,而只谈编码。通过本文,你可以了解JAVA中文问题的由来,问题

的解决方法,其中提了一下用JDBC访问数据库的方法。

二、问题描述:

1)在中文W2000中文窗口编译和运行,用的是国际版的JDK,连接的是中文W2000下的Cp936

编码的SQL SERVER数据库:

J:\exercise\demo\encode\HelloWorld>make

Created by XCompiler. PhiloSoft All Rights Reserved.

Wed May 30 02:54:45 CST 2001

J:\exercise\demo\encode\HelloWorld>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:\exercise\demo\encode\HelloWorld>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("中文".getBytes());//2

System.out.println("中文".getBytes("GB2312"));//3

System.out.println("中文".getBytes("ISO8859_1"));//4

System.out.println(new String("中文".getBytes()));//5

System.out.println(new String("中文".getBytes(),"GB2312"));//6

System.out.println(new String("中文".getBytes(),"ISO8859_1"));//7

System.out.println(new String("中文".getBytes("GB2312")));//8

System.out.println(new String("中文".getBytes("GB2312"),"GB2312"));//9

System.out.println(new

String("中文".getBytes("GB2312"),"ISO8859_1"));//10

System.out.println(new String("中文".getBytes("ISO8859_1")));//11

System.out.println(new

String("中文".getBytes("ISO8859_1"),"GB2312"));//12

System.out.println(new

String("中文".getBytes("ISO8859_1"),"ISO8859_1"));//13

}

catch(Exception e){

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航