日期:2014-05-16  浏览次数:20316 次

jsp servlet中文乱码的处理方法终极版
看完此博文,保证解决tomcat环境下jsp servlet中文乱码,不用再谷歌、百度了。还没解决的话,给我博客留言。


1.术语、约定
文中的乱码均指中文乱码,其他语言乱码不考虑
文中使用的环境是tomcat,其他环境不考虑
jsp、jsp文件指的是jsp源文件
jsp页面指的是浏览器请求jsp文件之后,在浏览器中的显示页面


2.jsp

编译jsp有以下几个步骤:
(1)把jsp转化为java源码。pageEncoding=xxx指定以xxx编码格式读取jsp文件,因此,jsp文件的编码格式应与pageEncoding值一致。
(2)把java源码编译为字节码,即.class文件。转化后的java源码为utf-8编码格式,字节码也为utf-8编码,我们无需干预。
(3)执行.class文件。在此过程,需向浏览器发送中文字符,contentType=xxx指定了jsp以xxx编码显示字符。也就是在浏览器中查看页面编码,其值为contentType指定的编码。

因此,在1、3环节,只要指定一致的编码格式(jsp文件编码格式=pageEncoding=contentType),即可保证jsp页面不出现乱码。
举例:jsp文件以utf-8格式编写,那么pageEncoding=utf-8, contentType=utf-8,就保证了jsp页面不出现乱码。


3.servlet
servlet可能处理post和get两种请求,下面分别阐述

对于post请求:
post请求发送表单参数,表单参数的编码格式由页面的编码格式决定。
html通过<meta http-equiv="Content-Type" content="text/html; charset=xxx">指定页面编码格式
jsp通过contentType=xxx指定页面编码格式
在servlet中,设定HttpServletRequest.setCharacterEncoding("xxx"),则getParameter不会得到乱码。
setCharacterEncoding设定了以xxx格式读取消息体中的内容,这个值应该与页面编码格式一致,否则必然乱码。
但是,该方法并不会对get请求的中文参数起作用。

对于get请求:
浏览器在get请求参数中遇到中文时,会自动编码提交给服务器。
IE编码格式为gbk
FF,Chrome编码格式为utf-8
而tomcat服务器默认对get请求进行ISO-8859-1编码,因此,要想在servlet中读取到非乱码的中文字符,需要做编码转换。
具体来说,就是把ISO-8859-1编码转换为浏览器编码。
java代码如下:
new String(param.getBytes("ISO-8859-1", "GBK");  // IE
new String(param.getBytes("ISO-8859-1", "utf-8");  // FF, Chrome