为什么需要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")) 就可以得到想提交的参数的原值。  

相关文章推荐

javascript对url进行encode的两种方式

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

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

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

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

.encodeURL函数主要是来对URI来做转码,它默认是采用的UTF-8的编码. . UTF-8编码的格式:一个汉字来三个字节构成,每一个字节会转换成16进制的编码,同时添加上%号. 假设页...
  • howlaa
  • howlaa
  • 2013年10月17日 11:23
  • 14457

JS为什么有时候要做两次encodeURI

JS为什么有时候要做两次encodeURI 这个问题的根本原因是服务器会自己做一次解码,且解决的字符集不一定是UTF-8。 对于var url = "b.jsp?name="+u_name...
  • tzy233
  • tzy233
  • 2014年03月27日 00:38
  • 1608

JS提交中文encodeURI两次

escape不编码字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z encodeURI不编码字符有82个:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,...

前台encodeURL后台decode无效

在使用window.location.href中传参数encodeURI(mktgPlanName) 后台java写String mktgPlanName=request.getParameter("...

中文字符处理encodeURI编码与decodeURI解码

 AjaxCSSjfreechart百度json  encodeURI(encodeURI(Name))可以多次加密 最近做了一个功能,将产生的JfreeChart报表及...

两次调用encodeURI来解决乱码问题

encodeURL函数主要是来对URI来做转码,它默认是采用的UTF-8的编码. UTF-8编码的格式:一个汉字来三个字节构成,每一个字节会转换成16进制的编码,同时添加上%号. 假设页面端输入的中文...

URL?param=问号传参中文乱码的解决办法

只作收藏,自己使用。原文请看链接!

encodeURI encodeURIComponent 的作用 及 应用

首先解释下 encodeURIComponent 的作用:将文本字符串编码为一个有效的统一资源标识符 (URI)。 为什么要用这个是因为我想把 username 整个当做参数传递给 CGI, 而不让...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:为什么需要JS里常需要做两次encodeURI(url)
举报原因:
原因补充:

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