1. 程式人生 > >JS中URL中的特殊字元問題:escape,encodeURI,encodeURIComponent

JS中URL中的特殊字元問題:escape,encodeURI,encodeURIComponent

URI 編碼方法

Global 物件的 encodeURI()encodeURIComponent()方法可以對URIUniform ResourceIdentifiers,通用資源識別符號)進行編碼,以便傳送給瀏覽器。有效的URI中不能包含某些字元,例如空格。而這兩個URI編碼方法就可以對 URI 進行編碼,它們用特殊的 UTF-8編碼替換所有無效的字元,從而讓瀏覽器能夠接受和理解。其中, encodeURI()主要用於整個URI(例如,http://www.wrox.com/illegal value.htm),而encodeURIComponent()主要用於對URI中的某一段(例如前面
URI 中的 illegal value.htm)進行編碼。


它們的主要區別在於, encodeURI()不會對本身屬於URI的特殊字元進行編碼,例如冒號、正斜槓、
問號和井字號;而encodeURIComponent()則會對它發現的任何非標準字元進行編碼。來看下面的例子。

var uri = "http://www.wrox.com/illegal value.htm#start";
//"http://www.wrox.com/illegal%20value.htm#start"
alert(encodeURI(uri));
//"http%3A%2F%2Fwww.wrox.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.wrox.com%2Fillegal%20value.htm%23start";
//http%3A%2F%2Fwww.wrox.com%2Fillegal value.htm%23start
alert(decodeURI(uri));
//http://www.wrox.com/illegal value.htm#start
alert(decodeURIComponent(uri));
這裡,變數 uri包含著一個由encodeURIComponent()編碼的字串。在第一次呼叫decodeURI()輸出的結果中,只有%20被替換成了空格。而在第二次呼叫decodeURIComponent()輸出的結果中,所有特殊字元的編碼都被替換成了原來的字元,得到了一個未經轉義的字串(但這個字串並不是一個有效的URI)。
URI 方法 encodeURI()encodeURIComponent()decodeURI()decodeURIComponent()用於替代已經被ECMA-2623版廢棄的 escape()unescape()
方法。 URI 方法能夠編碼所有Unicode字元,而原來的方法只能正確地編碼ASCII字元。


因此在開發實踐中,特別是在產品級的程式碼中,一定要使用
URI 方法,不要使用escape()unescape()方法