1 .以POST 方法提交的表单数据中有中文字符
由于Web 容器默认的编码方式是ISO-8859-1 ,在Servlet/JSP 程序中,通过请求对象的getParameter() 方法得到的字符串是 以ISO-8859-1 转换而来,这是导致乱码产生的原因之一。为了避免容器以ISO-8859-1 的编码方式返回字符串,对于以POST 方法提交的表单 数据,可以在获取请求参数值之前,调用request.setCharacterEncoding ("GBK" ),明确指定请求正文使用的字符编码方式是 GBK 。在向浏览器发送中文数据之前,调用response.setContentType ("text/html;charset=GBK" ),指定输 出内容的编码方式是GBK 。
对于JSP 页面,在获取请求参数值之前,写上下面的代码:
<%request.setCharacterEncoding("GB2312");%>
为了指定输出内容的编码格式,设置page 指令contentType 属性,如下:
<%@ page contentType="text/html; charset=GBK" %>
在Web 容器转换JSP 页面后的Servlet 类中,会自动添加下面的代码:
response.setContentType("text/html; charset=GBK");
2 .以GET 方法提交的表单数据中有中文字符
当提交表单采用GET 方法时,提交的数据作为查询字符串被附加到URL 的末端,发送到服务器,此时在服务器端调用setCharacterEncoding() 方法也就没有作用了。我们需要在得到请求参数的值后,自己做正确的编码转换。
String name = request.getParameter("name");
name=new String(name.getBytes("ISO-8859-1"),"GBK");
在第一行,调用getParameter() 方法得到的字符串name 的Unicode 值是以ISO-8859-1 编码转换而来,调用 name.getBytes ("ISO-8859-1" ),将得到原始的GBK 编码值,接着,对new String() 的调用将以GBK 字符集重新构造字符串的Unicode 编码。
为了方便从ISO-8859-1 编码到GBK 的转换,我们可以编写一个工具方法,如下:
public String toGBK(String str)
throws java.io.UnsupportedEncodingException
{
return new String(str.getBytes("ISO-8859-1"),"GBK");
}
3 .在数据库中存储和读取中文数据
对于大多数数据库的JDBC 驱动程序,在Java 程序和数据库之间传递数据都是以ISO-8859-1 为默认编码格式,所以,我们在程序中向数据库存储包 含中文的数据时,JDBC 驱动程序首先把程序内部的Unicode 编码格式的数据转化为ISO-8859-1 编码,然后传递到数据库中,加上数据库本身也 有字符集,这就是为什么我们常常在数据库中读取中文数据时,读到的是乱码。
要解决上述问题,只需要将数据库默认的编码格式改为GBK 或GB2312
并且 在连接数据库用的URL 后加入(以连接mysql 为例):useUnicode=true;characterEncoding=utf-8 如: url="jdbc:mysql:///db1?useUnicode=true&characterEncoding=utf-8" ,
即可,不同的数据库还提供了另外的方式来处理字符编码转换的问题,读者在实际应用过程中,可针对具体情况再做具体处理,只要理解了编码转换的过程,就能找到问题的所在,进而解决问题。
4 .Servlet/JSP 在不同语言系统的平台下运行
有时候,我们在中文系统平台下开发的Web 应用程序移植到英文系统平台下,在Servlet 和JSP 中直接书写的中文字符串在输出时,将显示为乱码。这是 因为在编译Servlet 类或者JSP 文件时,如果没有使用-encoding 参数指定Java 源程序的编码格式,javac 会获取本地操作系统默认采用 的字符集,以该字符集将Java 源程序转换为Unicode 编码保存到内存中,然后将源程序编译为字节码文件(字节码文件采用的是UTF-8 编码),保存 到硬盘上。
在英文平台下,采用的默认编码格式是ISO-8859-1 ,所以在编译转换后,执行输出时,原先在源文件中书写的中文字符串就变成了乱码。
要解决这个问题,在编译Servlet 类的源程序时,可以用-encoding 参数指定编码为GBK 或GB2312 ,例如:
javac –encoding GBK HelloServlet.java
对于JSP 页面,只要在page 指令中用contentType 属性或pageEncoding 属性指定编码格式为GBK 或GB2312 ,Web 容器就可以正确转换和编译JSP 文件了。例如:
<%@ page contentType="text/html; charset=GBK" %>
或
<%@ page pageEncoding="GBK" %>
在实际的Web 应用中,乱码问题产生的原因多种多样,然而只要我们理解了字符编码的转换过程,仔细地分析乱码产生的原因,找到问题的关键,就能对症下药,解决问题。