为什么需要JS里常需要做两次encodeURI(url)

原创 2016年05月31日 09:13:31

最近项目里经常出现前后端传送出现乱码的情况,不少同事问一为什么经常需要在JS里进行两次编码,这里进行下说明:


一般情况下, 发送 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")) 就可以得到想提交的参数的原值。  

JS中URL中的特殊字符问题:escape,encodeURI,encodeURIComponent

在使用url进行参数传递时,经常会传递一些中文名(或含有特殊字符)的参数或URL地址,在后台处理时会发生转换错误。在有些传递页面使用GB2312,而在接收页面使用UTF8,这样接收到的参数就可能会与原...
  • winy_lm
  • winy_lm
  • 2017年01月20日 17:56
  • 934

javascript对url进行encode的两种方式

javascript对url进行encode的两种方式 javascript可以使用的内置函数有 encodeURI() encodeURIComponent() 他们都是用utf-8的编...
  • tstcylq
  • tstcylq
  • 2015年02月03日 14:32
  • 1447

JS端GET请求encodeURL到web端decodeURL乱码问题

JS:window.location.href = "down.action?filepaths=" + encodeURI(encodeURI(filepaths));WEB:String s = ...
  • Lachie_Ye
  • Lachie_Ye
  • 2017年05月06日 21:06
  • 835

JS中URL中的特殊字符问题:escape,encodeURI,encodeURIComponent

在使用url进行参数传递时,经常会传递一些中文名(或含有特殊字符)的参数或URL地址,在后台处理时会发生转换错误。在有些传递页面使用GB2312,而在接收页面使用UTF8,这样接收到的参数就可能会与原...
  • rghanbing4
  • rghanbing4
  • 2017年06月01日 09:59
  • 1506

javascript中encodeURI和decodeURI方法

一、基本概念 encodeURI和decodeURI是成对来使用的,因为浏览器的地址栏有中文字符的话,可以会出现不可预期的错误,所以可以encodeURI把非英文字符转化为英文编码,decodeUR...
  • woshixuye
  • woshixuye
  • 2013年05月06日 11:04
  • 32416

JS 字符串编码函数(解决URL特殊字符传递问题):escape()、encodeURI()、encodeURIComponent()区别详解

JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decod...
  • jumtre
  • jumtre
  • 2016年05月13日 11:16
  • 3355

JS中encodeURI,escape,encodeURIComponent区别

js对文字进行编码涉及3个函数:escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent ...
  • swc493197713
  • swc493197713
  • 2012年05月22日 09:58
  • 19586

js中三种URI编码方式比较

js中三种URI编码方式比较js中三种URI编码方式比较 实例 1escape unescape 2encodeURIComponent decodeURIComponent推荐 3encodeU...
  • CSXIAOYAOJIANXIAN
  • CSXIAOYAOJIANXIAN
  • 2017年05月10日 00:55
  • 725

对url 里面的中文使用encodeURI,需要使用二次encodeURI

encodeURI 和 decodeURI 成对使用 encodeURI()     把字符串编码为 URI。 decodeURI()     解码某个编码的 URI。 encodeURI...
  • lin49940
  • lin49940
  • 2016年07月10日 17:40
  • 3417

为什么要两次调用encodeURI来解决乱码问题

.encodeURL函数主要是来对URI来做转码,它默认是采用的UTF-8的编码. . UTF-8编码的格式:一个汉字来三个字节构成,每一个字节会转换成16进制的编码,同时添加上%号. 假设页...
  • howlaa
  • howlaa
  • 2013年10月17日 11:23
  • 18930
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:为什么需要JS里常需要做两次encodeURI(url)
举报原因:
原因补充:

(最多只允许输入30个字)