ECMAScriptjs中之老三只编码函数:escape,encodeURI,encodeURIComponent

  1. eacape(): 该方法不见面指向 ASCII 字母和数字进行编码,也非会见对下这些
    ASCII 标点符号进行编码: * @ – _ + . /
    。其他兼具的字符都见面于转义序列替换。其它情况下escape,encodeURI,encodeURIComponent编码结果一致。

   escape对0-255之外的unicode值进行编码时输出%u****格式

   可以行使
unescape() 对
escape() 编码的字符串进行解码。

   ECMAScript v3 唱对台戏用该法,应用使用 decodeURI() 和
decodeURIComponent() 替代她。

  1. encodeURI 和 encodeURIComponent

encodeURI 和
encodeURIComponent都是ECMA-262正经被定义的函数,所有兼容这正式的语言(如JavaScript,
ActionScript)都见面实现就片只函数。它们都是用来针对URI
(RFC-2396)字符串进行编码的大局函数,但是它的处理方式和使用状况有所不同。为了说明其的不等,我们第一需明白RFC-2396中对此
URI中之字符分类:
1>保留字符(reserved
characters):这看似字符是URI中的保存重要字符,它们用于分割URI中之依次部分。这些字符是:”;”
| “/” | “?” | “:” | “@” | “&” | “=” | “+” | “$” | “,”
2>Mark字符(mark
characters):这好像字符在RFC-2396中专门定义,但是并未专门说明用途,可能是和别的RFC标准有关。
这些字符是:”-” | “_” | “.” | “!” | “~” | “*” | “‘” | “(” | “)”
3>基本字符(alphanum
characters):这看似字符是URI中之基点有,它概括有的不得了写字母、小写字母和数字。

以介绍完上面三近似字符串后,我们就算非常容易来解释encodeURI和encodeURIComponent函数的不同之处了:

encodeURI:
该函数对传播字符串中之持有非(基本字符、Mark字符和保留字符)进行转义编码(escaping)。有的急需转义的字符都遵循UTF-8编码转化成
为一个、两独或三独字节的十六进制转义字符(%xx)
。例如,字符空格”
“转换成”%20″。在这种编码模式下,需要编码的ASCII字符用一个字节转义字符代替,在\u0080和\u007ff之间的字符用鲜只字节转义字符代替,其他16呢Unicode字符用三独字节转义字符代替。

encodeURIComponent:
该函数处理方式和encodeURI只出一个不同点,那便是对保留字符同等做转义编码。这样url中之参数与价值才不见面被#抵特殊字符截断。
比如:http://localhost:8080/xss/XssServlet?username=A&T
Plastic,该url,后台的代码:

String username = request.getParameter(“username”);

落的username值为A,而非是我们愿意之 A&T Plastic。因为 username=A&T
Plastic,其中包含了保留字符&,并且没有进展编码,所以username的价值为其让截断了。所以对的做法是,对那个进行编码:encodeURIComponent(“A&T
Plastic”) == A%26T%20Plastic,然后用上面的连年改吧:

http://localhost:8080/xss/XssServlet?username=A%26T%20Plastic,后台才能获得正确的值:username==A&T
Plastic。

盖username的值含有了uri的保存字符,所以需要开展编码。

 

譬如,字符”:”被转义字符”%3A”代替

所以有面两只不同的函数,是盖咱们以写JS代码的时光对URI进行简单栽不同的编码处理要求。encodeURI可以据此来对整体的URI字符串进行编码处理。而encodeURIComponent可以本着URI中一个有进行编码,就此让这同样片好涵盖部分URI保留字符。这当咱们常见编程中凡特别使得的。比如下面的URI字符串:
http://www.mysite.com/send-to-friend.aspx?url=http://www.mysite.com/product.html
每当
这个URI字符串中。send-to-friend.aspx页面会创建HTML格式的邮件内容,里面会蕴藏一个链接,这个链接的地点便是端URI字符
串中之url值。显然上面的url值是URI中的一个有的,里面富含了URI保留重要字符。我们须调用encodeURIComponent对它进行编
码后使,否则上面的URI字符串会给浏览器认为是一个无效的URI。正确的URI应该如下:
http://www.mysite.com/send-to-friend.aspx?url=http%3A%2F%2Fwww.mysite.com%2Fproduct.html

无限多应用的应为encodeURIComponent,它是拿中文、韩文等特殊字符转换成utf-8格式的url编码,所以如果叫后台传递参数需要用encodeURIComponent时得后台解码对utf-8支持(form表单中之编码方式和目前页面编码方式相同

escape不编码字符来69只:*,+,-,.,/,@,_,0-9,a-z,A-Z

encodeURI不编码字符来82独:!,#,$,&,’,(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z

encodeURIComponent不编码字符来71个:!,
‘,(,),*,-,.,_,~,0-9,a-z,A-Z

例子:

alert(encodeURIComponent("A&T Plastic"));    //A%26T%20Plastic
alert(escape("A&T Plastic"));                //A%26T%20Plastic
alert(encodeURI("A&T Plastic"));            //A&T%20Plastic
alert(escape("A&T Plastic中"));                //A%26T%20Plastic%uFFFD%uFFFD

咱们看出 encodeURI 没有编码uri的保存字符
&,’中’被编码成了 %uFFFD%uFFFD

encodeURIComponent
就编码了保留字符&。

url的编码经常会面让下在XSS攻击中来绕了服务端的 xss filter,
对有威慑的url进行伪装,让不明用户失去点击

参考:

http://www.jb51.net/article/22880.htm

http://www.cnblogs.com/goody9807/archive/2009/01/16/1376913.html

 

=========

因此要是只是处理 get 提交时url地址被之乱码问题,可以使 encodeURI
来编码整个url;

苟参数中隐含保留字符需要进行编码,那么应该使 encodeURIComponent
来编码部分参数;

一经运用encodeURIComponent来拍卖中文乱码,那么前端需要采用有限涂鸦encodeURIComponent(encodeURIComponent(‘你好’)),Java后端平采用:

java.Net.URLDecoder.decode(param,”UTF-8″);

来解码;