encodeURIComponent编码2次

最近在项目中发现前台再往anction中发送数据时进行两次encodeURIComponent,经过上网查找发现以下解释比较合理,mask过来,以供参考,非常感谢原作者!!!

两次encodeURIComponent是因为第一次encodeURIComponent的时候出现了"%",这个符号在解析参数的时候是无法解析的,必须把"%"也进行编码,"%"编码后就是"%25",这样就不会出现问题了。

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

时间: 2024-10-05 21:21:45

encodeURIComponent编码2次的相关文章

encodeURI,encodeURIComponent编码

encodeURI().encodeURIComponent().decodeURI().decodeURIComponent() URL编码 Global对象的encodeURI()和encodeURIComponent()方法对URI进行编码,以便发送给浏览器.有效的URI中不能包含某些字符,例如空格.而这两个URI编码方法就可以对URI进行编码,它们用特殊的UTF-8编码替换所有无效的字符,从而让浏览器接受和理解. 其中,encodeURI()主要用于整个URI(例如,http://www

encodeURIComponent编码后java后台的解码

解决方法一: JavaScript: window.self.location="searchbytext.action?searchtext="+encodeURIComponent(encodeURIComponent(seartext)); java: searchtext=java.net.URLDecoder.decode(searchtext,"UTF-8"); 为什么要两次编码的原因:后台java代码给searchtext赋值的时候,本身已经使用了一次

JS escape、encodeURI 、encodeURIComponent 编码与解码[转]

转至:http://jc-dreaming.iteye.com/blog/1702407 本文讨论如何对传递参数用JS编码与解码 1:编码与解码方法的对应关系 escape -----------------------------------------------------unescape encodeURI -------------------------------------------------decodeURI encodeURIComponent -------------

encodeURIComponent编码后java后台解码乱码的解决

解决方法一: JavaScript: window.self.location="searchbytext.action?searchtext="+encodeURIComponent(encodeURIComponent(seartext)); java: searchtext=java.net.URLDecoder.decode(searchtext,"UTF-8"); 为什么要两次编码的原因: 后台java代码直接request.getParameter(&q

escape()、encodeURI()、encodeURIComponent() 编码解码

1 escape().encodeURI().encodeURIComponent()区别详解 2 3 JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent . 4 5 下面简单介绍一下它们的区别 6 7 1 escape()函数 8 9 定义和用法 10 escape() 函数可对字符串进行编码,这样就可以在所有的计算机上

js编码之encodeURIComponent使用介绍(asp,php)

因此对于JS脚本又重新研究了一下.在对新的URL编码的时候发现,网页编码的格式对于JS的影响很大,在这里书写一点 因为要新作系统,因此对于JS脚本又重新研究了一下.在对新的URL编码的时候发现,网页编码的格式对于JS的影响很大,在这里书写一点. {var B=siteUrl+this.actionUrl+(this.type==="all"?"":this.type)+"&SearchWord="+encodeURIComponent(A

URL编码与解码&escape, encodeURI和encodeURIComponent区别

通常如果一样东西需要编码,说明这样东西并不适合传输.原因多种多样,如Size过大,包含隐私数据,对于Url来说,之所以要进行编码,是因为Url中有些字符会引起歧义. 例如,Url参数字符串中使用key=value键值对这样的形式来传参,键值对之间以&符号分隔,如/s?q=abc&ie=utf-8.如果你的value字符串中包含了=或者&,那么势必会造成接收Url的服务器解析错误,因此必须将引起歧义的&和=符号进行转义,也就是对其进行编码. 又如,Url的编码格式采用的是AS

js中的三个编码函数:escape,encodeURI,encodeURIComponent

1. eacape(): 该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / .其他所有的字符都会被转义序列替换.其它情况下escape,encodeURI,encodeURIComponent编码结果相同. escape对0-255以外的unicode值进行编码时输出%u****格式 可以使用 unescape() 对 escape() 编码的字符串进行解码. ECMAScript v3 反对使用该方法,应用使用 deco

URL编码与解码

通常如果一样东西需要编码,说明这样东西并不适合传输.原因多种多样,如Size过大,包含隐私数据,对于Url来说,之所以要进行编码,是因为Url中有些字符会引起歧义. 例如Url参数字符串中使用key=value键值对这样的形式来传参,键值对之间以&符号分隔,如/s?q=abc&ie=utf-8.如果你的value字符串中包含了=或者&,那么势必会造成接收Url的服务器解析错误,因此必须将引起歧义的&和=符号进行转义,也就是对其进行编码. 又如,Url的编码格式采用的是ASC