response.sendRedirect乱码问题终极解决方案

读到这篇文章的同学想必是在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

时间: 2024-10-09 20:54:25

response.sendRedirect乱码问题终极解决方案的相关文章

vim、gvim在windows下中文乱码的终极解决方案

测试成功,完美解决. 只需修改VIM目录下面的这个文件_vimrc. 加油吧,骚年.很强大的! set encoding=utf-8 set fileencodings=utf-8,chinese,latin-1 if has("win32") set fileencoding=chinese else set fileencoding=utf-8 endif "解决菜单乱码 source $VIMRUNTIME/delmenu.vim source $VIMRUNTIME/

JSP中文乱码问题终极解决方案(下)

摘要: 本文首先从四个方面给出了在使用JSP过程中可能出现中文乱码的情形,具体包括JSP页面中文乱码.JSP源文件中文乱码.GET 请求的请求参数为中文乱码 和 POST 请求的请求参数为中文乱码四种情形,并针对每种情形给出了相应的终极解决方案. 一. JSP页面与JSP源文件乱码 在介绍JSP页面与JSP源文件的乱码问题前,首先我们必须对JSP页面中文乱码问题与JSP源文件中文乱码问题有一个清晰的概念,即: JSP页面中文乱码问题是指用户在浏览器看到的服务器所返回的jsp页面中,中文字符不能正

JSP中文乱码问题终极解决方案

在介绍方法之前我们首先应该清楚具体的问题有哪些,笔者在本博客当中论述的JSP中文乱码问题有如下几个方面:页面乱码.参数乱码.表单乱码.源文件乱码.下面来逐一解决其中的乱码问题. 一.JSP页面中文乱码 在JSP页面中,中文显示乱码有两种情况:一种是HTML中的中文乱码,另一种是在JSP中动态输出的中文乱码. 先看一个JSP程序: [java] view plaincopyprint? <%@ page language="java" import="java.util.

JavaWeb 乱码问题终极解决方案!

经常有读者在公众号上问 JavaWeb 乱码的问题,昨天又有一个小伙伴问及此事,其实这个问题很简单,但是想要说清楚却并不容易,因为每个人乱码的原因都不一样,给每位小伙伴都把乱码的原因讲一遍也挺费时间的,因此,松哥今天决定写一篇文章,和大伙好好捋捋 JavaWeb 中的乱码问题. 对于一些老司机而言,其实并不太容易遇到乱码问题,但是对于一些新手来说,乱码几乎是家常便饭,而且每当乱码时,网上搜了一大堆解决方案,发现自己的问题还是没能解决,其实这就是平时研究代码不求甚解导致的,乱码问题,也要去分析,然

【转】JSP中文乱码问题终极解决方案

文章转自:http://blog.csdn.net/beijiguangyong/article/details/7414247 在介绍方法之前我们首先应该清楚具体的问题有哪些,笔者在本博客当中论述的JSP中文乱码问题有如下几个方面:页面乱码.参数乱码.表单乱码.源文件乱码.下面来逐一解决其中的乱码问题. 一.JSP页面中文乱码 在JSP页面中,中文显示乱码有两种情况:一种是HTML中的中文乱码,另一种是在JSP中动态输出的中文乱码. 先看一个JSP程序: <%@ page language=&qu

response.sendRedirect()重新定向的乱码问题

这里response.sendRedirect("YPbianhaoModify.jsp?jinhuoshang="+jinhuoshang+"&jinhuoriqi="+jinhuoriqi)要是有中文的话就成了response.sendRedirect("YPbianhaoModify.jsp?jinhuoshang=进货商&jinhuoriqi=2007-09-23"); 这里的中文不进行处理,重定向的时候必然会出现http

JSP开发过程遇到的中文乱码问题及解决方案

JSP开发过程遇到的中文乱码问题及解决方案 来源:偶my耶的博客 发布时间:2015-03-31 阅读次数:543 8 对于程序猿来说,乱码问题真的很头疼,下面列举几种常见的乱码. 1.数据库编码不一致导致乱码 解决方法: 首先查看数据库编码,输入: show variables like "%char%"; 确认编码一致,如果不一致,可输入: SET character_set_client='utf8'; SET character_set_connection='utf8'; S

Servlet 中文乱码问题及解决方案剖析

一.常识了解 1.GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能不成立; 2.java.nio.charset.Charset.defaultCharset() 获得平台默认字符编码: 3.getBytes() 是通过平台默认字符集进行编码: 二.中文乱码出现 在学习任何一门技术时,经常会有初学者遇到中文乱码问题,比如MySQL,是因为在安装时没有设置:而在Servlet中,也会遇到中文乱码问题: 比如: OutputStream out = response.

jQuery ajax在GBK编码下表单提交终极解决方案(非二次编码方法)(转)

版权声明]:版权归作者所有,转载时请以超链接形式标明文章原始出处和作者信息及本声明:http://www.open-lib.com/Forum/Read_69_1.action 前言: 当jquery ajax在utf-8编码下(页面utf-8,接收utf-8),无任何问题.可以正常post.get,处理页面直接获取正确的内容. 但在以下情况下: GBK -> AJAX POST ->GBK UTF-8 -> AJAX POST ->GBK 后台代码无法获取正确的内容,通常表现为获