摘要 所有基于Java的应用程序都面临着一个让初学者非常头痛的问题-中文乱码。由于Java的内核和.class文件都是基于Unicode的,这使得Java程序具有良好的跨平台特性,但却容易造成中文乱码。另外,Web容器的默认编码方式是ISO-8859-1,所以在Java Web程序中用户在客户端输入以GBK方式编码的中文传输到服务器端,由Web容器以ISO-8859-1方式包装编码,并以该编码形式的html页面回送到本地客户端,这样都会造成中文乱码的问题,本文就Java Web中文乱码问题提出一些解决方案。

以POST方式提交的表单数据中含有中文

由于Web容器默认的编码方式是ISO-8859-1。

在Servlet/JSP程序中,通过请求对象getParameter方法得到的字符串是以ISO-8859-1转换而来,这是导致乱码产生的原因之一。

为了避免容器以ISO-8859-1编码方式返回字符串,对于以POST提交的表单数据,可以在获取请求参数之前,调用request.setCharacterEncoding("GBK"),明确指定正文使用的编码方式是GBK。
在向浏览器回送中文数据html页面时,调用response.setContentType("text/html;charset=GBK"),指定输出内容的编码方式是GBK。

对于JSP页面,在获取请求参数值之前,加上以下代码:

<%request.setCharacterEncoding(“GBK”);%>

为了指定输出内容的编码格式,设置页面属性:

<%page contentType=”text/html; charset=GBK” %>

在Web容器转换JSP页面后的Servlet类中,会自动添加以下代码:

response.setContentType(“text/html; charset=GBK”);

以GET方式提交的表单数据中含有中文

当提交表单采用GET方法时,提交的数据作为查询字符串被附加到URL的末端,发送到服务器,此时在服务器调用setCharacterEncoding方法也就没有作用了,我们需要在得到请求参数值后,自己做正确的编码转换。

1
2
String name = request.getParameter("name");
name = new String(name.getBytes("ISO-8859-1"), "GBK");

上述代码在第一行,调用getParameter方法得到的字符串name的Unicode值是以ISO-8859-1的编码转换而来,调用names.getBytes(“ISO-8859-1”),将得到原始的GBK编码值,接着对new String()方法的调用将以GBK字符集重新构造字符串的Unicoe编码。

为了方便从ISO-8859-1编码转换到GBK编码,我们编写一个工具方法,如下:

1
2
3
public String toGBK(String str) throws java.io.UnsupportedEncodingException{
return new String(str.getBytes("ISO-8859-1"), "GBK");
}

总结

在实际的Web应用中,乱码问题产生的原因多种多样,然而只要我们理解了字符编码转换过程,仔细地分析乱码产生的原因,找到问题的关键,就能对症下药,解决问题。