想必大家才开始做web开发时,或多或少都遇到过编码的问题吧。一开始肯定也被乱码折腾的够呛,总结一下Web中传递数据乱码的情况,希望同样被乱码困扰的朋友能够安心入睡!
现在为了省事,同时支持不同语言字符的显示,都会采取utf-8处理。
假如我的web.xml中filter配置如下:
<filter>
<filter-name>encode</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
这样的写法大家在web工程中都明白啥意思了,不用多说。
我们的web容器选择tomcat
场景:我想这么发送一个请求。
url: http://127.0.0.1:8080/card/getCard.do?share_location=0&share_name=暗室逢灯&share_office=销售总监&share_company=深圳市理才网信息技术有限公司&share_email=asd@qq.com
在服务端代码 String name = request.getParameter("share_name");
情况不好的话,你会发现居然取到的name 是乱码。不是你期望的汉字给你。
别着急,你可以这样处理下
name = new String(request.getParameter("empName").getBytes("iso-8859-1"),"utf-8");
哎,你此时会发现居然得到了中文。也许你会意识到问题所在了,就是还得我手动进行一次转码操作。其实出现这个问题的根本原因就是我们未修改tomcat
的默认编码所致。
默认情况下,tomcat使用的的编码方式:iso8859-1
修改tomcat下的conf/server.xml文件
找到如下代码:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
可以在这里添加一个属性:URIEncoding,将该属性值设置为UTF-8,即可让Tomcat(默认ISO-8859-1编码)以UTF-8的编码处理get请求。
修改完成后:<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
好了,此时万事大吉了,你就可以省去显示进行字符编码集的转换工作。
引深入一下,我现在稍作下变动如下,我换一种写法
我们都知道JS有个方法 encodeURI.把上面提到的url 经过encodeURI(url)方法的处理后会得到如下的地址
http://192.168.1.66:8080/dayhr_app/mobile/card/getCard.do?token=834a609e1a94432aec5aebb8edf34e65&share_location=0&share_name=%25E6%259A%2597%25E5%25AE%25A4%25E9%2580%25A2%25E7%2581%25AF&share_office=%25E9%2594%2580%25E5%2594%25AE%25E6%2580%25BB%25E7%259B%2591&share_company=%25E6%25B7%25B1%25E5%259C%25B3%25E5%25B8%2582%25E7%2590%2586%25E6%2589%258D%25E7%25BD%2591%25E4%25BF%25A1%25E6%2581%25AF%25E6%258A%2580%25E6%259C%25AF%25E6%259C%2589%25E9%2599%2590%25E5%2585%25AC%25E5%258F%25B8&share_phone=13545122255&share_email=asd@qq.com
对应的后端你是这样写
String name = java.net.URLDecoder.decode(request.getParameter("share_name"));
你会发现居然不是中文,这样写java.net.URLDecoder.decode(request.getParameter("share_name"),utf-8);就能得到你想要的中文了。
关于前端encodeURI编码的了解不做详细的介绍了,有兴趣的自己动手尝试下就明白了。
总之,遇到编码的问题场景还是很多的,也不光我说的这点内容,只是想说遇到这样的问题不用急,静下来亲自解决一两次,就会恍然大悟。譬如我说复杂一点的场景 前端先encodeURI utf-8编码,在经过web前端过滤器filter的gbk处理,在经过tomcat容器默认iso-8859-1处理。此时在我们得后台处理该是什么样子呢,答案是我们只需要一层层的反向解码出来就可以看到我们期望的内容了。记住编码和解码一致就是解决问题的根本所在。
author:rongchao
201501.27