读到这篇文章的同学想必是在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);
原文地址:http://blog.51cto.com/3436241/2086046