j2ee ssh框架 页面url传参乱码问题

来源:互联网 发布:重庆网络运营公司 编辑:程序博客网 时间:2024/05/18 01:55

前两天去把我们公司的项目部署到客户服务器上,但是项目运行起来以后,出现乱码问题。  在公司测试的时候却没有出现这个问题,于是各种搜

索,发现大都是直接给解决方法,没有什么基本的理论解释为什么出现乱码,页面传参到服务器(tomcat),汉字参数的处理过程,什么地方的处

理导致了乱码的产生。看了很多文章,感觉对url汉字传参有了一定的理解,这里给出我参考的几篇文章。

http://blog.csdn.net/yiyuhanmeng/article/details/7548505

http://blog.163.com/candy08aoyun@126/blog/static/12109780120102325956876/

总结一下,感觉处理乱码有一下几种方法

第一也是最简单的就是修改tomcat下的server.xml文件,中添加URIEncoding="UTF-8" ,这个方法需要

每部署一个地方就修改服务器url解析编码,而且同一服务器如果多个项目,则有可能出现不可预测的问题。

第二

http://xxx.do?ptname='我是中国人' 
String strPtname = request.getParameter("ptname"); 
strPtname = new String(strPtname.getBytes("ISO-8859-1"), "UTF-8");   

这种方法是默认系统编码进行处理的,其中"ISO-8859-1"取得就是当前系统默认的编码,我对各个操作系统不是很理解 ,不

清楚是不是所有都是一样的,如果操作系统之间的默认编码有差别,这个方法也是值得商榷的。

第三

在客户端用encodeURIComponent(fieldValue)方法编码,例如:

title=encodeURIComponent(title); //这是js里的函数

 url="<%=request.getContextPath()%>/print/printList!printTable.action?title="+title;

在服务端用java.net.URLDecoder.decode(getRequest().getParameter("title"),"UTF-8"),进行解码。

parent.window.location.href 和 iframe中src的乱码问题。

要在这两个url地址中传中文,必须加编码,然后再解码。

编码:encodeURIComponent(encodeURIComponent("包含中文的串"))

解码:java.net.URLDecoder.decode("需要解码的串","utf-8");

这个方法我觉得是最好的方法 ,无需依靠操作系统默认编码,也不需要修改tomcat的处理编码。特别声明的是这里的

编码:encodeURI(encodeURI("包含中文的串"))写两遍并不是手误什么的,是一定要这样写 ,

至于为什么,下面我就说一下我对页面传参到服务器(tomcat),汉字参数的处理过程的理解,如果有错的地方,请

各位看官指正。首先你在页面传一个汉字参数,这时候由于不同的浏览器会根据不同的编码对你的参数进行处理,一

个汉字大致就是被变成%AC24D 这样之类的东西,然后传到服务器,tomcat就会根据自己的配置编码对这串字符串

进行处理,将之按照服务器的编码进行转换,这里就是乱码出现的地方,由于不同浏览器之间处理汉字的编码不一样,

以及服务器配置的将字符串(%AC24D)转成汉字的编码不一样,导致 汉字转%AC24D 和%AC24D转汉字 所使用的

编码不同,出现乱码。

文笔不好不知说的是不是清晰,我的理解大致就是这样的。那么为什么要使用

编码:encodeURIComponent(encodeURIComponent("包含中文的串"))

解码:java.net.URLDecoder.decode("需要解码的串","utf-8");

这个方法呢,解释一下 encodeURIComponent("包含中文的串")这个方法会将汉字和某些特殊字符转成%AC24D

这种格式的,并且默认是以utf-8编码转的,我们在这里转两下,就会把%也会转成25好像,具体是什么忘了,总之

转完以后就是字母和数字的组合了,并且在前面在加一个%,会形成%25AC24D这样的字串 传到服务器以后,服务

器会解析一下,解析后得到的是%AC24D了 ,这样你在使用解码java.net.URLDecoder.decode("需要解码的串",

"utf-8");就可以成功的将你前台的汉字传到后台,并且中间就等于是在你原本的串上加了一层壳,服务器解析去掉一层,

就对你的解析没有影响了。写完了,不知道能不能表达自己的理解,如果有高见,可以评论说下,学习中。。。。。