encodeURI()、encodeURIComponent()、decodeURI()、decodeURIComponent() URL編碼
Global對象的encodeURI()和encodeURIComponent()方法對URI進行編碼,以便發送給瀏覽器。有效的URI中不能包含某些字符,例如空
格。而這兩個URI編碼方法就可以對URI進行編碼,它們用特殊的UTF-8編碼替換所有無效的字符,從而讓瀏覽器接受和理解。
其中,encodeURI()主要用於整個URI(例如,http://www.w3cmm.com/illegal value.htm),而encodeURIComponent()主要用於對URI中的某一段(例如前面URI中的illegal value.htm)進行編碼。它們的主要區別在於,encodeURI()不會對本身術語URI的特殊字符進行編碼,例如冒號、正斜杠、問號和井字號;而encodeURIComponent()則會對它發現的任何 非標准字符進行編碼。來看下面的例子:
var uri = "http://www.w3cmm.com/illegal value.htm#start";
//"http://www.w3cmm.com/illegal%20value.htm#start"
alert(encodeURI(uri));
//"http%3A%2F%2Fwww.w3cmm.com%2Fillegal%20value.htm%23start"
alert(encodeURIComponent(uri));
使用encodeURI()編碼后的結果是除了空格之外的其它字符都原封不動,只有空格被替換成了%20。而在encodeURIComponent()方法則會使用對應的編碼替換所有非字母數字字符。這也正是可以對整個URI使用encodeURI(),而只能對附加在現有URI后面的字符串使用encodeURIComponent()的原因所在。
一般來說,我們使用encodeURIComponent()方法的時候要比使用encodeURI()更多,因為在實踐中更常見的是對查詢字符串參數而不是對基礎URI進行編碼。
與encodeURI()和encodeURIComponent()方法對應的兩個方法分別是decodeURI()和decodeURIComponent()。其中,decodeURI()只能對使用encodeURI()替換的字符進行解碼。例如,它可將%20替換成一個空格,但不會對%23作任何處理,因為%23表示井字號(#),而井字號不是使用encodeURI替換的。同樣地,decodeURIComponent()能夠解碼使用encodeURIComponent()編碼的所有字符,即它可以解碼任何特殊字符的編碼。來看下面的例子:
var uri = "http%3A%2F%2Fwww.w3cmm.com%2Fillegal%20value.htm%23start"
//"http%3A%2F%2Fwww.w3cmm.com%2Fillegal value.htm%23start"
alert(decodeURI(uri));
//"http://www.w3cmm.com/illegal value.htm#start"
alert(decodeURIComponent(uri));
這里,變量uri包含着一個由encodeURIComponent()編碼的字符串。在第一次調用decodeURI()輸出的結果中,只有%20被替換成了空格。而在第二次調用decodeURIComponent()輸出的結果中,所有特殊字符的編碼都被替換成了原來的字符,得到了一個未經轉義的字符串。
URI方法encodeURI()、encodeURIComponent()、decodeURI()和decodeURIComponent()用於替代已經被ECMA-262第三版廢棄的escape()和unescape()方法。URI方法能夠編碼所有Unicode字符,而原來的方法只能正確地編碼ASCII字符。因此在開發實踐中,特別是在產品級的代碼中,一定要使用URI方法,不要使用escape()和unescape()方法。