- 浏览: 886460 次
- 性别:
- 来自: 杭州
-
文章分类
最新评论
-
hzw2312:
C = sin(MLatA)*sin(MLatB)*cos(M ...
根据地球上任意两点的经纬度计算两点间的距离 -
zhang_sun:
rewind方法的limit又是多少呢?等于capacity? ...
ByteBuffer的flip,clear及rewind区别 -
kalogen:
一种每次都获取到不同的随机数的办法int ranseed=12 ...
J2ME中Random类的使用 -
kalogen:
估计部署在某个端口下吧,仔细检查一下发布的配置文件
Tomcat负载均衡和集群环境的搭建 -
zhuchao_ko:
文件大点就嗝屁了~~~
Axis 1.4 上传二进制文件(base64Binary)
最近又碰到了中文乱码问题,这里我没有把数据库牵扯进来,先说下我的环境,servlet容器使用Tomcat6.0,浏览器FireFox3.0、IE6,涉及字符编码设置的地方我的思路就是编码的地方都统一使用UTF-8,具体配置如下:
1.所有页面的charset设置为UTF-8。
2.Tomcat的URIEncoding默认是ISO-8859-1,而我设置为UTF-8,主要是想解决中文命名的文件以及请求以get方式提交有可能出现的乱码问题。
3.添加过滤器,调用request.setCharacterEncoding("utf-8")方法将request的字符集设定为utf-8,解决请求以post方式提交的乱码问题。
其实这样的设置貌似是不会再出现乱码问题了,不过,问题依旧来了
,如果我在浏览器的地址栏中输入中文参数提交,返回的页面却出现了乱码。真搞不明白到底是哪里出了问题!说起来对中文乱码的问题一直是一支半解,出现乱码了,网上搜罗了一大堆资料,按照网上的配置,问题到是解决了,不过原理却搞的很模糊,一个请求发送到服务器,服务器业务逻辑处理后返回一个页面,这中间涉及的字符集转换,编码,解码过程一概不清楚。这次,折腾了半天,总算是更进一步了解了字符编码问题,这里做个总结。
先看我的总结,有不对的地方欢迎批评。
首先我们看下,一个请求响应的流程
浏览器 IE/FireFox ----------->Servlet容器------------------------>显示页面
编码 使用容器的URIEncoding转码 解码
我把用户发送请求方式不同引起的中文问题划分了四种类型:
1、表单的get提交
2、表单的post提交
3、页面链接传递中文参数
4、地址栏中参数直接输入中文提交
1.首先我们看表单get方式提交
浏览器根据页面的charset编码方式对页面进行编码,然后提交至服务器,首先进入对应的字符编码过滤器(如果有的话),不过Tomcat6.0对于get提交方式采用的是server.xml文件中的URIEncoding编码方式,而并不会采用过滤器中设置的编码,那么根据我的环境设置,jsp页面都使用UTF-8的编码,Servlet容器的URIEncoding也设置为UTF-8,则servlet不用进行转码即可正确解码,获得正常的中文字符串。那么,响应页面的中文因为页面的统一编码(UTF-8)自然也会正常显示。当然,如果我们Tomcat的URIEncoding设置为其他非UTF-8的编码方式时,页面的内容进入Tomcat解析时,因为Tomcat和页面的编码不统一,就需要转码。例如,如果我们采用Tomcat默认的ISO-8859-1,那么当我们使用request.getParameter("yourVariable")获取表单参数值时其实Servlet就进行了转码,它会以容器编码方式进行解码,这个过程如下:
UTF-8(编码)-->ISO-58859-1(解码)
这个过程也相当于我们使用如下的语句
Java代码
new String(变量值.getBytes("UTF-8"),"ISO-8859-1");根据API的解释,先将变量值以UTF-8字符集编码转换为字节序列,再以ISO-8859-1字符集解码字节数组,构造出新的字符串对象。
等价于以下方式:
Java代码
String code = "编码";code = URLEncoder.encode(code,"UTF-8");code = URLDecoder.decode(code,"ISO-8858-1"); 例如表单的username属性以字符串"编辑"提交,那么进入容器后,FormBean中的这个变量会乱码,request.getParameter(username)一样的效果,s1就是request返回的结果,下面是内存快照。

不过即使这样,我们依然可以使用不恰当的方法显示正常的中文,即逆向转码,例如上面的乱码,我们可以通过ISO8859-1-->UTF-8这种方式还原我们提交时的中文。以下是GBK,UTF-8,ISO-8859-1三者之间互相转换的内存快照:

我们可以看到,偶数汉字可以在UTF-8,GBK两者中互相转换,而奇数个汉字则不能。综上看来,貌似Tomcat的URIEncoding设置为UTF-8是最好的解决办法,不过这样的设置依然无法解决上面我所说的第三、第四种情况。大家继续向下看。(这里有一点我不确定,就是页面提交至Servlet容器时,是以页面的charset方式编码后直接进入容器,还是以charset转码为ISO-8859-1方式进入,大家有什么见解?)
2.表单的post提交
对于这种方式的请求,request.setCharacterEncoding("一般来自于web.xml中过滤器设置的参数")方法进行编码设置将会产生作用,struts的表单提交方式默认为post方式,那么按照上面我的环境设置,页面,容器,都采用UTF-8编码方式,就不会产生中文乱码问题。
3.页面链接中传递中文参数
我虚拟一个这样的场景,请求页面中有如下代码
Html代码
<%String username = "编辑";%><a href="hello.do?username=<%=username%>">页面中链接传递中文</a>对于这种方式,我们需要先将参数使用统一的编码方式编码,将编码后的字符放入链接,这里我对参数以UTF-8方式编码,如下
Java代码
<%String username = java.net.URLEncoder.encode("编辑","UTF-8");%>那么这样我们也不会产生中文乱码问题
4.地址栏中参数直接输入中文提交
例如浏览器地址栏中输入"http://localhost:8080/helloapp.do?username=编辑"提交,对于这种方式,浏览器不会采用页面的charset方式对URL中的中文进行编码后提交至服务器(IE,FireFox都一样),而是采用系统的GBK转码为ISO-8859-1之后提交至Servlet容器,那么,如果对于前三种方式我们所做的设置,在这里就有问题了,因为进入容器时中文进行了GBK至ISO-8859-1的转码,而之前我们的Servlet容器URIEncoding设置为UTF-8,当我们使用request.getParameter("username")时,相当于又进行了这样的流程GBK-->ISO-8859-1-->UTF-8,按照以上我们使用的测试中文,“编辑”,使用request.getParameter("username")则会得到这样的结果�༭,下图是进行转码的内存快照:

我们可以看到
“编辑”经过从GBK-->ISO-8859-1-->UTF-8的过程后得到的就是�༭这样的结果,这里我们还会想到那进行2次逆向转码看看,不过可惜的是,结果为“锟洁辑”。对于这种情况,我们的解决办法就是,Tomcat的URIEncoding采用默认的ISO-8859-1字符集,那么我们可以在程序中通过ISO-8859-1-->GBK这样不恰当的逆向转码方式得到正常的中文“编辑”,但这样的结果是,我们get请求方式的中文处理解决办法就需要改变。如,在我的环境下就需要进行ISO-8859-1-->UTF-8的转码,挺不爽。
综上,对于乱码问题,前三种方式是一般用户的请求方式,第四种属于非正常途径的请求方式,对于这种方式产生的问题我认为无法很好的解决,也不需要解决。我看到javaeye对于这样的情况就没有处理,不知道大家在自己的项目中是如何处理的?我的实验是,IE6的设置会影响应用路径的编码方式,例如地址栏中请求一个中文JSP页面,如:http://localhost:8080/helloapp/编辑.jsp,IE默认是勾选"以UTF-8发送URL"项的,那么按照我上面总结的处理方式,这个请求可以正常显示页面,如图:

如果取消IE的这个选项,那么浏览器会以GBK编码应用路径的中文,得到的结果如图:

按照我上面的设置,这里如果将Tomcat的URIEncoding设置为GBK,则也可以正常显示页面。对于FireFox3.0,则是以UTF-8编码。
最后,回到我的题目,向大家讨教下,IE6的“以UTF-8发送URL”选项设置对请求页面字符编码有影响吗?欢迎讨论!
我的测试代码共享给大家:),使用的是struts1.2,struts的jar包,大家可以去apache下载。
这里推荐个链接,有兴趣的可以深入了解更多字符集、编码的问题。
http://hideto.iteye.com/blog/97803
1.所有页面的charset设置为UTF-8。
2.Tomcat的URIEncoding默认是ISO-8859-1,而我设置为UTF-8,主要是想解决中文命名的文件以及请求以get方式提交有可能出现的乱码问题。
3.添加过滤器,调用request.setCharacterEncoding("utf-8")方法将request的字符集设定为utf-8,解决请求以post方式提交的乱码问题。
其实这样的设置貌似是不会再出现乱码问题了,不过,问题依旧来了

先看我的总结,有不对的地方欢迎批评。
首先我们看下,一个请求响应的流程
浏览器 IE/FireFox ----------->Servlet容器------------------------>显示页面
编码 使用容器的URIEncoding转码 解码
我把用户发送请求方式不同引起的中文问题划分了四种类型:
1、表单的get提交
2、表单的post提交
3、页面链接传递中文参数
4、地址栏中参数直接输入中文提交
1.首先我们看表单get方式提交
浏览器根据页面的charset编码方式对页面进行编码,然后提交至服务器,首先进入对应的字符编码过滤器(如果有的话),不过Tomcat6.0对于get提交方式采用的是server.xml文件中的URIEncoding编码方式,而并不会采用过滤器中设置的编码,那么根据我的环境设置,jsp页面都使用UTF-8的编码,Servlet容器的URIEncoding也设置为UTF-8,则servlet不用进行转码即可正确解码,获得正常的中文字符串。那么,响应页面的中文因为页面的统一编码(UTF-8)自然也会正常显示。当然,如果我们Tomcat的URIEncoding设置为其他非UTF-8的编码方式时,页面的内容进入Tomcat解析时,因为Tomcat和页面的编码不统一,就需要转码。例如,如果我们采用Tomcat默认的ISO-8859-1,那么当我们使用request.getParameter("yourVariable")获取表单参数值时其实Servlet就进行了转码,它会以容器编码方式进行解码,这个过程如下:
UTF-8(编码)-->ISO-58859-1(解码)
这个过程也相当于我们使用如下的语句
Java代码
- new String(变量值.getBytes("UTF-8"),"ISO-8859-1");
new String(变量值.getBytes("UTF-8"),"ISO-8859-1");根据API的解释,先将变量值以UTF-8字符集编码转换为字节序列,再以ISO-8859-1字符集解码字节数组,构造出新的字符串对象。
等价于以下方式:
Java代码
- String code = "编码";
- code = URLEncoder.encode(code,"UTF-8");
- code = URLDecoder.decode(code,"ISO-8858-1");
String code = "编码";code = URLEncoder.encode(code,"UTF-8");code = URLDecoder.decode(code,"ISO-8858-1"); 例如表单的username属性以字符串"编辑"提交,那么进入容器后,FormBean中的这个变量会乱码,request.getParameter(username)一样的效果,s1就是request返回的结果,下面是内存快照。

不过即使这样,我们依然可以使用不恰当的方法显示正常的中文,即逆向转码,例如上面的乱码,我们可以通过ISO8859-1-->UTF-8这种方式还原我们提交时的中文。以下是GBK,UTF-8,ISO-8859-1三者之间互相转换的内存快照:

我们可以看到,偶数汉字可以在UTF-8,GBK两者中互相转换,而奇数个汉字则不能。综上看来,貌似Tomcat的URIEncoding设置为UTF-8是最好的解决办法,不过这样的设置依然无法解决上面我所说的第三、第四种情况。大家继续向下看。(这里有一点我不确定,就是页面提交至Servlet容器时,是以页面的charset方式编码后直接进入容器,还是以charset转码为ISO-8859-1方式进入,大家有什么见解?)
2.表单的post提交
对于这种方式的请求,request.setCharacterEncoding("一般来自于web.xml中过滤器设置的参数")方法进行编码设置将会产生作用,struts的表单提交方式默认为post方式,那么按照上面我的环境设置,页面,容器,都采用UTF-8编码方式,就不会产生中文乱码问题。
3.页面链接中传递中文参数
我虚拟一个这样的场景,请求页面中有如下代码
Html代码
- <%
- String username = "编辑";
- %>
- <a
href="hello.do?username=<%=username%>">页面中链接传递中文</a>
<%String username = "编辑";%><a href="hello.do?username=<%=username%>">页面中链接传递中文</a>对于这种方式,我们需要先将参数使用统一的编码方式编码,将编码后的字符放入链接,这里我对参数以UTF-8方式编码,如下
Java代码
- <%
- String username = java.net.URLEncoder.encode("编辑","UTF-8");
- %>
<%String username = java.net.URLEncoder.encode("编辑","UTF-8");%>那么这样我们也不会产生中文乱码问题
4.地址栏中参数直接输入中文提交
例如浏览器地址栏中输入"http://localhost:8080/helloapp.do?username=编辑"提交,对于这种方式,浏览器不会采用页面的charset方式对URL中的中文进行编码后提交至服务器(IE,FireFox都一样),而是采用系统的GBK转码为ISO-8859-1之后提交至Servlet容器,那么,如果对于前三种方式我们所做的设置,在这里就有问题了,因为进入容器时中文进行了GBK至ISO-8859-1的转码,而之前我们的Servlet容器URIEncoding设置为UTF-8,当我们使用request.getParameter("username")时,相当于又进行了这样的流程GBK-->ISO-8859-1-->UTF-8,按照以上我们使用的测试中文,“编辑”,使用request.getParameter("username")则会得到这样的结果�༭,下图是进行转码的内存快照:

我们可以看到
“编辑”经过从GBK-->ISO-8859-1-->UTF-8的过程后得到的就是�༭这样的结果,这里我们还会想到那进行2次逆向转码看看,不过可惜的是,结果为“锟洁辑”。对于这种情况,我们的解决办法就是,Tomcat的URIEncoding采用默认的ISO-8859-1字符集,那么我们可以在程序中通过ISO-8859-1-->GBK这样不恰当的逆向转码方式得到正常的中文“编辑”,但这样的结果是,我们get请求方式的中文处理解决办法就需要改变。如,在我的环境下就需要进行ISO-8859-1-->UTF-8的转码,挺不爽。
综上,对于乱码问题,前三种方式是一般用户的请求方式,第四种属于非正常途径的请求方式,对于这种方式产生的问题我认为无法很好的解决,也不需要解决。我看到javaeye对于这样的情况就没有处理,不知道大家在自己的项目中是如何处理的?我的实验是,IE6的设置会影响应用路径的编码方式,例如地址栏中请求一个中文JSP页面,如:http://localhost:8080/helloapp/编辑.jsp,IE默认是勾选"以UTF-8发送URL"项的,那么按照我上面总结的处理方式,这个请求可以正常显示页面,如图:

如果取消IE的这个选项,那么浏览器会以GBK编码应用路径的中文,得到的结果如图:

按照我上面的设置,这里如果将Tomcat的URIEncoding设置为GBK,则也可以正常显示页面。对于FireFox3.0,则是以UTF-8编码。
最后,回到我的题目,向大家讨教下,IE6的“以UTF-8发送URL”选项设置对请求页面字符编码有影响吗?欢迎讨论!
我的测试代码共享给大家:),使用的是struts1.2,struts的jar包,大家可以去apache下载。
这里推荐个链接,有兴趣的可以深入了解更多字符集、编码的问题。
http://hideto.iteye.com/blog/97803
发表评论
-
Eclipse中jsp、js文件编辑时,卡死现象解决汇总
2016-03-01 11:36 739使用Eclipse编辑jsp、js文件时,经常出现卡死现象, ... -
转-HTTP cookies 详解
2015-03-29 14:35 784HTTP cookies,通常又称作"cookie ... -
<s:property />标签:是输出指定值用的标签。可以输出任何范围的值。
2012-03-24 13:37 885<s:property />标签:是输出指定值用的 ... -
如何解决“HTTP错误403-禁止访问”问题?
2012-03-20 18:18 5843100 Continue:初始的请求已经接受,客户应当继续发送 ... -
JSP 的301重定向服务端技术实现
2012-03-09 20:27 1143HttpServletRequest rq = (HttpS ... -
解决火狐不支持Cursor:hand的方法
2011-07-15 15:55 1253firefox 下cursor style="cur ... -
JavaScript中json对象和string对象之间的转化
2011-03-21 20:03 1337json对象 var json = {aa:true,bb:t ... -
服务器端包含,html文件不支持
2011-03-14 13:42 1754要在html包含文件,参考: 在宿主页面中嵌入外部页面 刘 ... -
Ext TabPanel items高度宽度自适应(续)
2011-01-30 10:52 4988经过努力调试,终于解 ... -
如何用photoshop输出html(div+css)网页
2011-01-28 21:21 945在修改好相应的文字与图象之后,我们就将PSD文件输出(X)HT ... -
CSS中的!important属性用法
2010-10-16 14:46 915关于CSS的运用技巧有很多, 今天主要探讨一下CSS中 !im ... -
position 的 static、relative、absolute、fixed、inherit
2010-10-11 13:51 1138网上也早有关于 position 的讲解,我个人觉得写得不全面 ... -
IE和Firefox中Javascript和CSS的区别
2010-10-11 12:18 11021. 对象 问题 1.1 Form对象 现有问题:现有代码 这 ... -
IOException while loading persisted sessions: java.io.EOFException
2010-09-29 18:44 756这个 异常一般是tomcat非正常关闭引起的,只要清除tomc ... -
浅谈javascript的分号
2010-08-25 16:56 1034javascript的分号代表语句的结束符,但由于javasc ... -
关于createTextRange和createRange的一些用法
2010-08-23 20:05 1749一、返回createTextRange的text和htmlTe ... -
去掉输入中的空格 但是字符串中的光标位置不变
2010-08-23 20:04 1247<script type="text/java ... -
Struts2 Result-type(封装Action层到View层的跳转逻辑)(1)
2010-08-14 16:05 3778Struts2将Result列为一个独立的层次,可以说是整个S ... -
网站二级菜单演示代码
2010-08-14 08:43 1271<!DOCTYPE html PUBliC " ... -
grid.getSelectionModel的所有操作
2010-08-13 19:32 24001. var model = grid.getSelectio ...
相关推荐
在IT领域,特别是Web开发中,字符编码的处理是一大挑战,尤其是在跨浏览器、跨平台的环境下,如在Ajax请求中遇到的FireFox与IE之间的乱码兼容问题。本文将深入探讨这一问题,并提供详细的解决方案。 ### Ajax与字符...
在开发Web应用时,尤其是使用HTML5标准时,可能会遇到跨浏览器的中文乱码问题,尤其是在旧版的Internet Explorer...遵循这些步骤,你应该能够避免或解决中文乱码的问题,从而提供一个跨浏览器的、显示正常的Web页面。
C#HTML导出excel时文件名,IE,火狐浏览器不兼容,乱码。故此将ExcelHelper.FileName(Request.ServerVariables["HTTP_USER_AGENT"].ToUpper(), $"文件名{DateTime.Now:_yyyyMMdd}", out filename, out encoding);
在互联网世界中,浏览器是我们与Web交互的主要工具,而IE(Internet Explorer)作为曾经的主流浏览器,虽然现在已被其他如Chrome、Firefox等取代,但在某些特定环境下仍然被使用。本主题聚焦于一个常见问题——“IE...
然而,这个问题的特殊之处在于,它只在IE浏览器中出现,而在Firefox(FF)和Chrome浏览器中正常显示,这就排除了编码设置不正确的原因。 进一步分析发现,问题可能与浏览器对Ajax请求的处理有关。IE浏览器在处理...
在使用Javascript时,需要注意浏览器的差异性,例如IE和Firefox的处理方法不同。 URL汉字编码问题是一个复杂的问题,需要根据不同的情况选择适当的编码方法。同时,在使用Javascript时,需要注意浏览器的差异性,...
下面我们就来详细解析如何实现“设为首页”和“加入收藏”的功能,并确保它们能够在Internet Explorer(IE)和Firefox等主流浏览器上正常运行。 #### 一、理解需求与目标 根据给定文件的信息,“设为首页”是指将...
这个问题在不同的浏览器上表现可能不尽相同,例如在IE10和火狐中就可能引起混淆。本文将详细讨论如何解决HTML5在IE10和火狐下的中文乱码问题。 首先,我们需要理解的是,中文乱码通常与字符编码设置有关。字符编码...
本文主要探讨了中文乱码的解决方案,特别是在使用Tomcat6.0作为servlet容器,与Firefox3.0和IE6浏览器交互时的情况。 首先,要理解中文乱码的产生,涉及到字符编码的转换和解码过程。通常,字符编码分为两种:页面...
在导出过程中,如果没有正确设置字符编码,就可能导致接收方无法正确解码,从而出现乱码。为解决这个问题,我们需要确保从HTML到导出文件的整个流程中,字符编码的一致性。在使用`tableExport`时,可以配置`charset`...
- **其他浏览器兼容性考虑**:虽然上述代码主要考虑了Firefox和IE,但在实际应用中还需要考虑更多现代浏览器如Chrome、Safari等。这些浏览器通常能较好地处理UTF-8编码的文件名,因此对于它们可以直接使用原始的...
在JQuery的Ajax POST请求中,当尝试向服务器发送包含中文字符的数据时,这些数据在Firefox和Chrome等现代浏览器中可以正常传递并被后台解析,但在Internet Explorer(IE)下却显示为乱码。这通常意味着编码和解码...
标题和描述中提到的问题是关于FF(Firefox)浏览器和IE(Internet Explorer)在下载文件时出现的乱码问题。这通常是由浏览器对文件名编码方式的不同处理引起的,尤其是在处理中文文件名时。以下是对这个问题的详细...
发现很多园子里的人在处理Response下载文件名是... 如果想在FireFox下输出没有编码的文件,并且IE下输出的文件名中空格不为+号,就要多一次判断了。 代码如下: if (Request.UserAgent.ToLower().IndexOf(“msie”) > -
乱码:如果日历出现中文乱码,并且如果在Eclipse中,那么请调整js的属性中编码为utf-8,html页面亦如是。 效果:页面为一个TextField空间,隐藏一个Div。点击TextField,显示Div,加载日历;点击某一日期,将日期值...
本文主要探讨了在使用Tomcat作为servlet容器,浏览器包括Firefox3.0和IE6的情况下,如何解决中文乱码问题,以及各种请求方式(GET、POST)下可能出现的乱码情况。 首先,确保所有页面的`charset`设置为`UTF-8`是...
火狐浏览器(Firefox)是一款非常受欢迎的开源网络浏览器,它以其强大的可定制性和丰富的扩展库而闻名。在Firefox中,用户可以通过安装各种扩展来增强浏览器的功能,满足个性化需求。以下是一些在描述中提到的常见...
使用本文的代码,你将可以让 IE(Internet Explorer)、Opera、Firefox 及 Chrome 的用户享受到没有乱码且支持空格文件名的文件输出引擎,同时支持文件名中各种像“# $ % ^ &”等常见的符号,如 "Microsoft.Asp.Net....
这种现象在不同的浏览器中表现不一,如Internet Explorer(IE)和Firefox,这主要是因为浏览器和服务器之间默认的字符集编码可能不一致。 ### 使用IHttpModule的原理 IHttpModule是ASP.NET提供的一种机制,用于在...