尽管关于Java中文问题的讨论已经相当多了,但由于Java的相关技术标准繁多,面向Java的Web服务器、应用服务器以及JDBC数据库驱动等都没有官方的标准,所以Java应用在处理中文时所存在的问题不仅没有消失而且随着所选用的服务器、驱动程序以及运行环境等因素的不同而变化。那么我们如何从众多现象中找出问题所在,并进行分析和解决呢?与大部分的讨论不同,本文将主要从如何猜测、发现和检查问题的角度给出建议,帮助开发人员找出可能引起问题的各种源头,从而更好地解决Java的中文问题。
引言
尽管对于Java中文处理问题的讨论已不乏其数,但由于Java技术涉及内容广(J2EE包含了十几种相关技术),技术供给商繁多,面向Java的Web服务器、应用服务器以及JDBC数据库驱动等都没有官方的标准,所以Java应用在处理中文过程中出了存在固有的问题外也存在随着选用的服务器,驱动程序的不同而带来的Java中文问题的多变性,增加了问题的复杂度。那么,我们如何在这么纷繁的现象中找到问题的症结呢?
Java中文问题的一般解决办法
事实上,Java的中文问题都是由于Java应用所采用的缺省编码格式与目标或者应用所要读入字符的编码格式不同而造成的(具体参见文献1)。对于如何解决Java的中文问题,通常有四种方法:
1)选择JDK的中文本地化版本。尽管Java2 JDK的中文本地化版本(http://java.sun.com/prodUCts/jdk/1.2/chinesejdk.Html)并不是一个官方的版本,Sun公司也没有承诺会对该本地化版本进行升级,但其仍不失为一个Java中文问题的解决方案。
2)选择合适的编译参数。对于Java的国际版本来讲,我们也可以在编译Java应用的时候通过指定确定的编码机制来实现其编译结果对中文的支持。例如,对于需要支持繁体中文和简体中文应用可以通过javac -encoding big5 sourcefile.java 和javac -encoding gb2312 sourcefile.java来编译源程序。
3)通过编程的方式实现字符编码的转换代码。通过编程的方式来解决Java的中文问题,已经成为了一种较为普遍的做法。下面就是一种最常见的字符编码转换函数,其将字符的编码格式转换为中文Windows系统的GBK编码形式。
public static String toChinese(String strvalue)
{
try{
if(strvalue==null)
return null;
else
{
strvalue = new String(strvalue.getBytes("ISO8859_1"), "GBK");
return strvalue;
}
}catch(Exception e){
return null;
}
}
4)定义字符输出集。对于jsp应用,我们可以通过<%@ page contentType="text/html; charset=GBK" %>或<%@ page contentType="text/html; charset=GB2312" %>来定义JSP页面的字符输出集。当然,我们也可以通过HTML的标记<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">来定义字符的输出集。