原文出处:http://eeelin.iteye.com/blog/1777719
URL编码很混乱
1.直接在网址栏输,网址路径中包含汉字,"www.xx.com/ff/问答",
"问答"将用的是utf-8编码.
2.直接在网址栏输,网址种的参数部分有汉字,"www.xx.com/ff/info.php?name=苏州",
"苏州"用的是操作系统的'默认编码'编码.据说可以在浏览器里设置这个编码.
3.在网页上点submit按钮,GET或者POST提交,按照网页编码格式编码,下面是U8编码
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
4.用AJAX提交,有的浏览器是U8,有的是取系统默认编码.
5.其他乱七八糟的....
解决办法
无任系统是什么,无任浏览器是什么,无任网页编码是什么
用Javascript的encodeURI()方法编码,就都变为unicode编码.
[encodeURI()的JS解码函数是decodeURI()]
客户端:两次JS
encodeURI(encodeURI($("#userName").val()));
服务端:一次解码
Java: String name = URLDecoder.decode(old,"UTF-8");
php: urldecode ("%E8%83%A1%E6%96%8C");
原理:
url只可以传ASCII码里的字符,其他字符过不了,先要变%XX才可以通过.
比如:"胡斌"要变"%E8%83%A1%E6%96%8C"[u8编码]才可以通过.
这里最最重要的是:E8-83-A1这U8编码的结构非常重要,因为你知道这是U8,
为了不破坏这个结构,再URL编码一下,变:
%25E8%2583%25A1%25E6%2596%258C
可以看到,只有"%"再次变"%25",E8-83-A1这个你知道的U8编码结构依然还在.
然后:%25E8%2583%25A1%25E6%2596%258C到了服务器,
服务器根据规定[通过的肯定是URL编码过的,然后检查有没有类似"%XX"的东西,
看见"%XX"此类的东西,服务器帮着还原了,注意'%'后仅仅是两个X]
%25E8%2583%25A1%25E6%2596%258C还原成%E8%83%A1%E6%96%8C,
就是说服务器以为你传的参数就是"%E8%83%A1%E6%96%8C",
但是你知道,"%E8%83%A1%E6%96%8C"确实是你要的参数,只不过你编码过了,
而且你也知道这个是U8编码结构,所以你再用U8反编一次就可以了.
你也可以这么记:
服务器这么"吃"数据,只能吃"一个字母"或者"%XX"这两种格式.其他吃不下.