读到这篇文章的同学想必是在response.sendRedirect乱码问题上出现了迷惑,只好问度娘了。但是如果度娘能把我们的迷惑完全解释清楚,也就不存在这篇文章了。既然本文就像标题那样吹下了大牛,闲话少叙看看笔者是如何把这个牛一步步的吹下去的。
    在JAVAEE开发时经常会遇到中文乱码问题,对于老程序员来说也是一件比较头疼的问题。我们通常是遇到问题时上网搜一搜,有时候运气好问题也就解决了,可是很少去从本质上去关注问题为什么会产生?到底是怎么解决的?

首先来看第一个问题,为什么会产生乱码?乱码是指中文乱码,也就是中文字符显示出现了问题,而英文字符很少出现乱码问题。中文字符是以中文编码格式在计算机中进行存储的。常见的中文编码格式有GB2312,BIG5,GBK,而我们在开发时通常采用UTF-8码,UTF-8码几乎包含了全世界各种语言的编码,基本上解决了国际化的问题。 要解决乱码问题,牢记一句话:你的字符是以什么编码方式存储的就要以什么格式读取。

一、普通jsp页面的乱码问题 1.打开myeclipse新建一个web工程。 2.打开index.jsp文件,在第一行就能看到此页面的编码格式。 我们在body里写一句中文吧。 保存文件,问题来了。 这段提示大概的意思是你要保存的页面中有中文,建议你把ISO-8859-1换成正确的编码方式。只能选择Save as UTF-8了,不然你就保存不了的。 发布一下,在浏览器中果然看到了乱码。 小白到这一步就疑惑了,我明明用UTF-8保存了啊,为什么还是出现乱码了。问题在这里

你虽然用UTF-8格式保存了文件,但是浏览器不认啊。因为浏览是按照pageEncoding="ISO-8859-1" 来读取页面内容进行显示的,你既然告诉它让它用ISO-8859-1的编码格式来显示,那么它就乖乖的听你的了。怎么才能正常显示出来呢?只要重新告诉浏览器采用正确的编码格式就可以了。 3.在浏览器页面右键选择编码格式为UTF-8。 可是每次都要在浏览器中选择转换是不是太麻烦了? 4.将<%@ page language="java" import="java.util." pageEncoding="ISO-8859-1"%>中的"ISO-8859-1"改成"utf-8"就可以了。这样每次打开页面时就能正常显示中文了。 到这里如果不深究下去,也就基本能解决jsp页面乱码的问题了。可是有爱较真的朋友就会问了,你前文不是说中文主要采用GBK/GB2312进行编码的吗,那么我把pageEncoding="ISO-8859-1"改成pageEncoding="GBK"或”GB2312”不就行了吗?说干就干,果断修改。问题出现了,怎么又出现乱码了? 5.修改<%@ page language="java" import="java.util." pageEncoding="utf-8"%>为 <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> 修改<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />为 <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />。 本来以为能正常看到中文了,可是乱码再次出现了。 问题就出在你虽然改了pageEncoding="gb2312"以及content="text/html; charset=gb2312",但是文件保存格式却没有改,需要把文件的保存格式也要改成gb2312才行。 6.解决办法 用EditPlus打开index.jsp文件,然后转码成GB2312,同时要在<head></head>标签中加上<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />保存就可以了。 这么折腾一番以后,熟悉的中文是不是又出现了?

二、servlet处理表单时乱码问题 1.接收post提交的数据

只要图中3 处的编码一致基本就能解决问题了,建议全部使用utf-8码。 2.接收get提交的数据 设置同1.

三、servlet处理超链接中的中文问题

四、servlet1通过response.sendRedirect();传值给servlet2 流程如下

提交表单中包含中文时,servlet2就会显示乱码了。 网上很多人的解决方案是,在servlet1中,先给username指定编码格式 username = new String(username.getBytes("ISO-8859-1"),"utf-8"); 而后,在servlet2中,通过 String username = request.getParameter("username");取到servlet1传过来的值后再次给username指定编码格式。 username = new String(username.getBytes("ISO-8859-1"),"utf-8");

这种方式如果运气好的话可以解决问题,如果运气不好,还是乱码。问题出在哪里? 原来,除了在两个servlet中强制指定了编码格式,在tomcat/conf/server.xml中还得进行配置。 找到 <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> 添加 URIEncoding=" ISO-8859-1"属性,如果不添加则默认为URIEncoding=" utf-8"。 因此username = new String(username.getBytes("ISO-8859-1"),"utf-8"); 也就无法生效了。 解决方案: 1.修改tomcat/conf/server.xml文件 <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding=" ISO-8859-1"/> 然后使用 username = new String(username.getBytes("ISO-8859-1"),"utf-8"); 强制为中文字符指定编码格式。 2.使用 request.getRequestDispatcher("/Servlet2").forward(request, response); 代替 response.sendRedirect("/encoding/Servlet2?username=" + username);