快速业务通道

Java编程技术中汉字问题的分析及解决 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-24
stmt = tf_input.getText(); //Before sending statement to DB server,converting it to sql statement. dbbyte1 = sqlstmt.getBytes(); sqlstmt = newString(dbbyte1,”iso-8859-1”); _stmt = _con.createStatement(); _stmt.executeUpdate(sqlstmt); ……

问题:如果客户机上存在CLASSPATH 指向 JDK的CLASSES.ZIP 时(称为A 情况),上述程序代码可正确执行。但是如果客户机只有浏览器,而没有 JDK 和 CLASSPATH 时(称为B 情况),则汉字无法正确转换。

我们的分析:

1.经过测试,在A 情况下,程序运行时系统的缺省编码方式为GBK 或者 GB2312 。在B 情况下,程序启动时浏览器的JAVA 控制台中出现如下错误信息:

Can''t find resource for sun.awt.windows.awtLocalization_zh_CN

然后系统的缺省编码方式为“8859-1”。

2.如果在转换字符串时不采用系统缺省编码方式,而是直接采用 “GBK” 或“GB2312”,则在A 情况下程序仍然可正常运行,在B 情况下,系统出现错误:

UnsupportedEncodingException。

3.在客户机上,把 JDK的CLASSES.ZIP 解压后,放在另一个目录中,CLASSPATH 只包含该目录。然后一边逐步删除该目录中的.CLASS 文件,另一边运行测试程序,最后发现在一千多个 CLASS 文件中,只有一个是必不可少的,该文件是:

sun.io.CharToByteDoubleByte.class。

将该文件拷到服务器端和其它的类放在一起,并在程序的开头 IMPORT 它,在B 情况下程序仍然无法正常运行。

4.在A 情况下,如果在CLASSPTH中去掉 sun.io.CharToByteDoubleByte.class ,则程序运行时测得默认编码方式为“8859-1”,否则为“GBK” 或 “GB2312” 。

如果JDK的版本为1.2以上的话,在B 情况下遇到的问题得到了很好的解决,测试的步骤同上,有兴趣的读者可以尝试一下。

Java编程技术中汉字问题的分析及解决(3)

时间:2010-04-27 IBM 段明辉

Java中文问题的根源分析及解决

在简体中文MS Windows 98 + JDK 1.3 下,可以用 System.getProperties() 得到 Java运行环境的一些基本属性,类PoorChinese 可以帮助我们得到这些属性。

类PoorChinese的源代码:

public class PoorChinese { }

执行java PoorChinese后,我们会得到:

系统变量file.encoding的值为GBK ,user.language的值为zh ,user.region的值为CN ,这些系统变量的值决定了系统默认的编码方式是GBK 。

在上述系统中,下面的代码将 GB2312 文件转换成 Big5 文件,它们能够帮助我们理解 Java中汉字编码的转化:

? import java.io.*; import java.util.*; ? public class gb2big5 { ? static int iCharNum=0; ? public static void main(String[] args) { System.out.println("Input GB2312 file, output Big5 file."); if (args.length!=2) { System.err.println("Usage: jview gb2big5 gbfile big5file"); System.exit(1); String inputString = readInput(args[0]); writeOutput(inputString,args[1]); System.out.println("Number of Characters in file: "+iCharNum+"."); } ? static void writeOutput(String str, String strOutFile) { try { FileOutputStream fos = new FileOutputStream(strOutFile); Writer out = new OutputStreamWriter(fos, "Big5"); out.write(str); out.close(); } catch (IOException e) { e.printStackTrace(); e.printStackTrace(); } } ? static String readInput(String strInFile) { StringBuffer buffer = new StringBuffer(); try { FileInputStream fis = new FileInputStream(strInFile); InputS

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号