龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

java-汉字问题深入谈

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
一、主题:关于Java的中文问题 JAVA的中文问题比较突出,主要表现在控制面板输出,jsp页面输出和数据库访问上。 本文尽量避开字体问题,而只谈编码。通过本文,你可以了解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("中文".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){
  
  

精彩图集

赞助商链接