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);

解决方案 »

  1.   

    这个要看服务端是什么语言,如果是ASP,那前端只需一次 escape ,后端一次 unescape 即可。如果是PHP,那前端需要两次 encodeURI,因为一次encodeURI还有一些字符不会被编码。
      

  2.   

    是jsp的,,,,请问“一次encodeURI还有一些字符不会被编码”是什么意思啊?
    哪些会被一次编码?哪些又必须要两次呢?每一次编码的作用又分别是什么呢?
      

  3.   

    encodeURI 是编码,只会越弄越乱!decodeURI 才是解码!lz 搞混了吧!Web 开发常用手册JScript语言参考.rar
    http://download.csdn.net/source/308916DHTML参考手册.rar
    http://download.csdn.net/source/308913样式表中文手册.chm
    http://download.csdn.net/source/304124
      

  4.   

    我是在用ajax传参数的时候出现的乱码,我在网上查了一下,发现下面的帖子,照着做就好了,可是我不明白为什么要encode两次,帖子内容如下:
    ==============================================================参数转换异常
    地址: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);
      

  5.   

    一看你的问题我就猜到大概了。
    因为Tomcat服务器会自动帮你做一次URLDecode,所以再加上你自己在代码里面写的URLDecode,一共就是两个Decode了,既然要两次Decode,当然就需要两次Encode了。或许你会问,干脆只Encode一次,然后在java代码里不Decode,呵呵,这个也是不行的,这其实也就是为什么要进行Encode的原因吧
      

  6.   


    这里并不准确, 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); // 仍然是 "?"
      

  7.   

    一般情况下, 发送 encodeURIComponent(parmeName)+"="+encodeURIComponent(parmeValue);
    接收时, 直接 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")) 就可以得到想提交的参数的原值。
      

  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))
      

  9.   

    浏览器会给你编一次 用gbk编 
      

  10.   

    浏览器为什么用gbk编而不用别的?所有浏览器都这样 还是某一个浏览器这样?所有字符都编码还是编码一部分?请您指教
      

  11.   


    使用 <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 
      

  12.   

    escape () 这个方法不错阿,我一直在用它,但是网上有人说他不好,我也不知道为什么!我是asp.ent网站开发时用的!呵呵,每个人是情况而定吧!并不是非黑即白!!
      

  13.   


    encodeURI 方法不会对下列字符进行编码:":"、"/"、";" 和 "?"。
      

  14.   

    用了8楼的方法
    $name=iconv("utf-8","gb2312",urldecode($_GET['name']));
    这样就成功了
      

  15.   

    我怎么在php中urlencode4次转译。在js中decodeURIComponent字符2次   就不乱码了啊?求解、
      

  16.   

    用一次与二次的不同在你是别人的javascript库,这需2次,需要再次解析。如你不是用别的javascript库,用一次就行了。