经过URL传中文参数时,在服务端后台获取到的值每每会出现乱码问题,解决方案有不少种,本文主要介绍如何经过encodeURI来解决中文乱码问题:前端
first:前端传递参数的时候须要对中文参数进行两次encodeURI处理:java
var requestUrl = 'url?roleName='+encodeURI(encodeURI("rowObj.appName")); 数组
注:rowObj.appName表示即将传到后台的带中文的字符串服务器
second:在服务器端后台程序代码中要用java.net.Decode进行解码,获得中文:app
String appName= java.net.URLDecoder.decode(request.getParameter("roleName"),"UTF-8");函数
两步搞定!ui
然而,为何前端要进行两次encodeURI???缘由以下:编码
一、encodeURI函数主要是来对URI来作转码,它默认采用的是utf-8的编码;url
二、常规来看,中文汉字在utf-8中通常是3个字节构成,每个字节会转换成16进制的编码,同时加上%号;spa
假设页面中须要传到后台的中文是一个“中”字,按照下面的过程走一遍:
1)第一次encodeURI,按照utf-8的方式获取字节数变成[-28,-72,-83],对字节码数组进行遍历,把每一个字节转化成对应的16进制数,因而就变成了[E4,B8,AD],最终变成[% E4,% B8,% AD] (注意:请去掉%和编码中间的空格,我这边写出来大家看到就是乱码了,下面的这种也是同样),此时已经没有了多字节字符,所有都是单字节字符。
2)第二次encodeURI进行编码,会把%看作转义字符,而且不编码%后面的字符,会把%变为%25,因而刚刚的数组就变成了[% E4,% B8,% AD],而后就把处理好的[% E4,% B8,% AD]发往服务器,当应用服务器调用getparameter方法时,getparameter方法会去向应用服务器请求参数,然而应用服务器最初收到的就是从前端发来的[% E4,% B8,% AD],应用服务器容器会默认解一次码,而容器默认解码时采用的编码是容器的默认编码,多是utf-8,GBK,或者ISO-8859,都能获得[% E4,% B8,% AD],由于会把%解析成%,而且把这个值返回给getparameter方法;
3)最终用java.net.Decode 采用utf-8编码进行解码,就能获得“中”字了;
因此,若是当时只是单单编码一次,当容易自动解码(默认解一次码)的时候,若是是按照 ISO-8859 去解码 UTF-8 编码的东西而后返回给getparameter方法就是乱码了。
核心代码:
js : encodeURI(encodeURI("rowObj.appName"))
java :java.net.URLDecoder.decode(request.getParameter("roleName"),"UTF-8");
我的小结,仅作参考,若有问题,欢迎各位大神指教,另外,感谢两篇参考文献,地址:
http://blog.csdn.net/howlaa/article/details/12834595
http://www.tuicool.com/articles/fuqIBju