forward到html乱码,response.sendRedirect乱码问题终极解决方案(示例代码)

读到这篇文章的同学想必是在response.sendRedirect乱码问题上出现了迷惑,只好问度娘了。但是如果度娘能把我们的迷惑完全解释清楚,也就不存在这篇文章了。既然本文就像标题那样吹下了大牛,闲话少叙看看笔者是如何把这个牛一步步的吹下去的。

在JAVAEE开发时经常会遇到中文乱码问题,对于老程序员来说也是一件比较头疼的问题。我们通常是遇到问题时上网搜一搜,有时候运气好问题也就解决了,可是很少去从本质上去关注问题为什么会产生?到底是怎么解决的?

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

要解决乱码问题,牢记一句话:你的字符是以什么编码方式存储的就要以什么格式读取。

一、普通jsp页面的乱码问题

1.打开myeclipse新建一个web工程。

2.打开index.jsp文件,在第一行就能看到此页面的编码格式。

e2970b090ff7708d61a5907c0ca425ee.png

我们在body里写一句中文吧。

ae5aca5c5e41fca901db898a0fad6061.png

保存文件,问题来了。

235d14423a0a7d85aa42e053e19ecc54.png

这段提示大概的意思是你要保存的页面中有中文,建议你把ISO-8859-1换成正确的编码方式。只能选择Save as UTF-8了,不然你就保存不了的。

发布一下,在浏览器中果然看到了乱码。

386d11a2e5807f5e3d1cb5ae1debe8d5.png

小白到这一步就疑惑了,我明明用UTF-8保存了啊,为什么还是出现乱码了。问题在这里

4908db76a408fb04eff97ed4198335d5.png

你虽然用UTF-8格式保存了文件,但是浏览器不认啊。因为浏览是按照pageEncoding="ISO-8859-1" 来读取页面内容进行显示的,你既然告诉它让它用ISO-8859-1的编码格式来显示,那么它就乖乖的听你的了。怎么才能正常显示出来呢?只要重新告诉浏览器采用正确的编码格式就可以了。

3.在浏览器页面右键选择编码格式为UTF-8。

95675be8abb4e317d13f7657ca5cf5e7.png

可是每次都要在浏览器中选择转换是不是太麻烦了?

4.将中的"ISO-8859-1"改成"utf-8"就可以了。这样每次打开页面时就能正常显示中文了。

到这里如果不深究下去,也就基本能解决jsp页面乱码的问题了。可是有爱较真的朋友就会问了,你前文不是说中文主要采用GBK/GB2312进行编码的吗,那么我把pageEncoding="ISO-8859-1"改成pageEncoding="GBK"或”GB2312”不就行了吗?说干就干,果断修改。问题出现了,怎么又出现乱码了?

5.修改为

修改为

本来以为能正常看到中文了,可是乱码再次出现了。

问题就出在你虽然改了pageEncoding="gb2312"以及content="text/html; charset=gb2312",但是文件保存格式却没有改,需要把文件的保存格式也要改成gb2312才行。

6.解决办法

用EditPlus打开index.jsp文件,然后转码成GB2312,同时要在

标签中加上保存就可以了。

98c855f5fe3bfe8496c458c88141f4cc.png

这么折腾一番以后,熟悉的中文是不是又出现了?

二、servlet处理表单时乱码问题

1.接收post提交的数据

5ec67b93bf2a253ba563806ed32d3642.png

dc0e81d9cd6514a6b293699ddbdda85c.png

只要图中3 处的编码一致基本就能解决问题了,建议全部使用utf-8码。

2.接收get提交的数据

设置同1.

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

270fb8e48330ea588ad73d4b7e6f2d68.png

四、servlet1通过response.sendRedirect();传值给servlet2

流程如下

13634f35c0fe9d8e1e3b66a11a2f2c48.png

提交表单中包含中文时,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中还得进行配置。

找到

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文件

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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值