var url="/demo/login.do?userName="+userName+"&pwd="+pwd; url=encodeURI(url); url=encodeURI(url);为什么要用两次encode才不是乱码? 而像下面用escape函数就不行呢? var url="/demo/login.do?userName="+escape(userName)+"&pwd="+escape(pwd);
这里并不准确, encodeURI 不编码的字符,不管encodeURI多少次,都不编var s = encodeURI("?"); s = encodeURI(s); s = encodeURI(s); s = encodeURI(s); s = encodeURI(s); s = encodeURI(s); s = encodeURI(s); alert(s); // 仍然是 "?"
哪些会被一次编码?哪些又必须要两次呢?每一次编码的作用又分别是什么呢?
http://download.csdn.net/source/308916DHTML参考手册.rar
http://download.csdn.net/source/308913样式表中文手册.chm
http://download.csdn.net/source/304124
==============================================================参数转换异常
地址:http://hi.baidu.com/comasp/blog/item/e13e928b4eeb59d2fc1f10d8.html
做ajax传递参数的时候遇到这个异常,在网上找了N天的东西,还是没找到答案,原来我一直没发现原来是 escape带来的错误。我是这样写的 var url = "b.jsp?name=" + escape(u_name);服务端获取:String name=request.getParameter("name");
name=new String(name.getBytes("iso-8859-1"));
System.out.println(name);结果老是报错:org.apache.tomcat.util.http.Parameters processParameters
警告: Parameters: Character decoding failed. Parameter skipped.
java.io.CharConversionException: isHexDigit.我知道是字符串转换异常,可是就不知道怎么样弄好。后来听说是escapse的问题,于是开始找资料了。终于解决了。先把url改下: var url = "b.jsp?name=" +u_name;
url=encodeURI(url);
url=encodeURI(url); //写一个不行。如果写一个就是????号。
//写2个,则输出 %df%a4这中.服务端获取:String name=request.getParameter("name");
name = java.net.URLDecoder.decode(name,"UTF-8"); //这句话一定要,因为如果不写的 //话,编码 就 是%E5%A6%88%System.out.println(name);
因为Tomcat服务器会自动帮你做一次URLDecode,所以再加上你自己在代码里面写的URLDecode,一共就是两个Decode了,既然要两次Decode,当然就需要两次Encode了。或许你会问,干脆只Encode一次,然后在java代码里不Decode,呵呵,这个也是不行的,这其实也就是为什么要进行Encode的原因吧
这里并不准确, encodeURI 不编码的字符,不管encodeURI多少次,都不编var s = encodeURI("?");
s = encodeURI(s);
s = encodeURI(s);
s = encodeURI(s);
s = encodeURI(s);
s = encodeURI(s);
s = encodeURI(s);
alert(s); // 仍然是 "?"
接收时, 直接 String paramValue = request.getParameter(paramName); // 容器自动解码.我们知道 encodeURIComponent 使用的是 UTF-8 编码规则来编的.
如果 request.getParameter(paramName) 时,容器也按 UTF-8 解的话,是正确的. 根本无须在客户端
进行二次的 encodeURIComponent(...)
如果 request.getParameter(paramName),容器没有按 UTF-8 解的话, 结果只有一个,就是乱码!
容器按什么编码来解码,决定于 request.setCharacterEncoding(***) 或者 服务器程序配置.如果你在 jsp 程序中,能够 request.setCharacterEncoding("UTF-8"), 并且 修改服务器配置,让容器在解 GET 提交的参数时,使用 UTF-8.客户端提交前不用二次编码, 接收时,也只要直接 request.getParameter(paramName) 即可---------------------为什么网上会有人提出在客户端对字符串重复编码两次呢.
如果因为项目需要,不能指定容器使用何种编码规则来解码提交的参数, 比如:需要接收来自不同页面,不地编码的参数内容时。 (又或者是开发人员被这有点复杂的东东搞得晕头转向,不懂得如何正确的去做好这接收参数的工作)
这个时候,在客户端对参数进行二次编码,可以有效的避开“提交多字节字符”的这个棘手问题。
因为第一次编码,你的参数内容便不带有多字节字符了,成了纯粹的 Ascii 字符串。(这里把编第一次的结果叫成 [STR_ENC1] 好了。[STR_ENC1] 是不带有多字节字符的)
再编一次后,提交,接收时容器自动解一次 (容器自动解的这一次,不管是按 GBK 还是 UTF-8 还是 ISO-8859-1 都好,都能够正确的得到 [STR_ENC1])
然后,再在程序中实现一次 decodeURIComponent (Java中通常使用 java.net.URLDecoder(***, "UTF-8")) 就可以得到想提交的参数的原值。
恩,是,我记得之前的项目里,后端是PHP,结果前端要两次编码,好象是escape(encodeURI())http://www.w3cgroup.com/article.asp?id=231在后端是PHP程序的情况下,保持前端Javascript和PHP之间传值的统一编码可以使用以下函数进行处理:WEB前端JavaScript编码:escape(encodeURI(string))解码:unescape(decodeURI(string))WEB后端Php编码:urlencode(string)解码:urldecode(urldecode(string))
使用 <form>...</form> 提交的,浏览器才会编码.
ajax 提交的,需要自己手动---------------------------------------------------------<form>提交时,浏览器使用什么编码编,决定于 form 的 accept-charset 属性(标准浏览器) 或者 document.charset(IE)
<form accept-charset="...." >...</form>提交 application/x-form-www-encoded 表单时,浏览器 把所有参数 按 key=value 的形式组合
分别对 key, value 进行编码.多个参数间,用 "&" 连接, 如: key2=%E4%B8%AD%E6%96%87&key=AAAA&key=BBB&key1=CCC&%E6%B1%89%E5%AD%97=%E4%B8%AD%E6%96%87
encodeURI 方法不会对下列字符进行编码:":"、"/"、";" 和 "?"。
$name=iconv("utf-8","gb2312",urldecode($_GET['name']));
这样就成功了