`
huanghaifeng1990
  • 浏览: 19400 次
文章分类
社区版块
存档分类
最新评论

IE7,ie8 ,火狐显示正常,ie6就乱码了解决方法

 
阅读更多
最近又碰到了中文乱码问题,这里我没有把数据库牵扯进来,先说下我的环境,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代码

  • newString(变量值.getBytes("UTF-8"),"ISO-8859-1");

new String(变量值.getBytes("UTF-8"),"ISO-8859-1");根据API的解释,先将变量值以UTF-8字符集编码转换为字节序列,再以ISO-8859-1字符集解码字节数组,构造出新的字符串对象。
等价于以下方式:
Java代码

  • Stringcode="编码";
  • 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代码

  • <%
  • Stringusername="编辑";
  • %>
  • <a
    href="hello.do?username=<%=username%>">页面中链接传递中文</a>

<%String username = "编辑";%><a href="hello.do?username=<%=username%>">页面中链接传递中文</a>对于这种方式,我们需要先将参数使用统一的编码方式编码,将编码后的字符放入链接,这里我对参数以UTF-8方式编码,如下
Java代码

  • <%
  • Stringusername=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
分享到:
评论

相关推荐

    Ajax FireFox IE 乱码兼容问题

    这是一个ajax解决乱码的问题WEBSERVICE项目

    HTML5在IE10、火狐下中文乱码问题的解决方法.docx

    HTML5在IE10、火狐下中文乱码问题的解决方法.docx

    C#HTML导出excel文件名火狐,IE浏览器乱码

    C#HTML导出excel时文件名,IE,火狐浏览器不兼容,乱码。故此将ExcelHelper.FileName(Request.ServerVariables["HTTP_USER_AGENT"].ToUpper(), $"文件名{DateTime.Now:_yyyyMMdd}", out filename, out encoding);

    在FireFox/IE下Response中文文件名乱码问题解决方案

    只是针对没有空格和IE的情况下使用Response.AppendHeader()如果想在FireFox下输出没有编码的文件,并且IE下输出的文件名中空格不为+号,就要多一次判断了,接下来将详细介绍下感兴趣的朋友可以了解下,或许对你有所...

    HTML5在IE10、火狐下中文乱码问题的解决方法

    学习几天HTML5了,之前一直在看文档,没有动手写,昨晚开始写代码,发现中文显示乱码,之前以为是不兼容IE10、然后换成火狐,谁知也不行,最后折腾一番,原来在编辑网页的时候,不仅仅是添加&lt;meta charset=utf-8&...

    js兼容火狐中文日历calender.ie.firefox.mqney

    乱码:如果日历出现中文乱码,并且如果在Eclipse中,那么请调整js的属性中编码为utf-8,html页面亦如是。 效果:页面为一个TextField空间,隐藏一个Div。点击TextField,显示Div,加载日历;点击某一日期,将日期值...

    彻底解决Asp.net 文件下载时文件名的中文乱码和空格异常全球性技术难题

    使用本文的代码,你将可以让 IE(Internet Explorer)、Opera、Firefox 及 Chrome 的用户享受到没有乱码且支持空格文件名的文件输出引擎,同时支持文件名中各种像“# $ % ^ &”等常见的符号,如 "Microsoft.Asp.Net....

    js 日历控件 兼容ie、firefox、opera

    js 日历控件 兼容ie、firefox、opera 已测试通过。如果出乱码重新保存编码格式。该日历在firefox下需要把function document.onclick()注释掉。现已更新。 最新下载最新:http://download.csdn.net/source/1901107

    修改ie,火狐,搜狗浏览器主页

    可以把ie,火狐,搜狗浏览器主页修改成指定的网址

    将搜狗浏览器的收藏夹导入到IE,FF等浏览器的小工具

    因为浏览器的收藏夹的html文件的编码方式 不同,Firefox使用的是UTF-8编码,而IE是ANSI编码. 用记事本打开这个HTM文件。选择“另存为”,“编码”选择项改为ANSI,保存。重现打开应该不会乱码了。反之亦然~。 4....

    jquery ajax post提交数据乱码

    在用jquery处理html5的应用的时候,一直在firefox下测试都正常,用户用pad访问的时候说有乱码,自己试验了下果然,后发现chrome和ie内核下都是有此问题,此问题设置了页面属性为utf-8时候,只有firefox是传的charset...

    模拟163弹出对话框(兼容IE firefox)

    用div模拟163对话框,可拖拉,可以根据自己的需求更改源码 大家打开的如果发生脚本错误,出现空白页,没关系那是因为乱码,请加上 ;charset=UTF-8" /&gt;

    7384迷你广告信息发布系统 v3.0

    经过多日反复改进,增加了分类,并可以在OPERA,firefox,360,IE8,sogou,safari,chrome,世界之窗,360急速等浏览器正常显示。 另外对数据库重新设计制作。以及页面JS需要调用的ID名称都转小写了。 V3.0 (2012.12....

    微信息发布系统 3.0.rar

    经过多日反复改进,增加了分类,并可以在OPERA,firefox,360,IE8,sogou,safari,chrome,世界之窗,360急速等浏览器正常显示。 另外对数据库重新设计制作。以及页面JS需要调用的ID名称都转小写了。 微信息发布系统 ...

    Java下载文件时文件名乱码问题解决办法

    我最近在开发时遇到了文件另存为时文件名出现乱码,在火狐上正常的文件名,在IE中又出现乱码问题,然后好不容易在IE下调试好了文件名乱码问题,在火狐下又出现乱码,最后终于感觉这样是能解决了。具体如下:

    如何解决JQuery ajaxSubmit提交中文乱码

    因此,无论是 Firefox或者IE,提交的数据都是一致的,都是UTF-8编码后的数据。 查看Header,发现Entity中的Content-Type存在差异 在Firefox中,Content-Type指定了字符集为utf-8。 而IE里面却没有任

    java web 乱码 问题

     本人在刚用firefox时遇到了url中文乱码的问题,找自己程序及配置找了老久也没解决问题,后来才发现原来是浏览器的配置问题。  问题:编码为utf-8,url 出现乱码。form表单get、post方式都无乱码,页面链接地址...

    站长俱乐部asp新闻发布系统精简版v1.0

    新增功能: 开放了版面的颜色修改 开放了密码的修改 开放了栏目的增加修改 ... IE和Firefox均能正常访问; 800*600,1024*768的分辨率均能正常访问; 网站采用UTF-8编码,各国用户均能正常访问,不会出现乱码; 提供10套模版

Global site tag (gtag.js) - Google Analytics