JS中URL中的特殊字元問題:escape,encodeURI,encodeURIComponent
URI 編碼方法
Global 物件的 encodeURI()和encodeURIComponent()方法可以對URI(Uniform ResourceIdentifiers,通用資源識別符號)進行編碼,以便傳送給瀏覽器。有效的URI中不能包含某些字元,例如空格。而這兩個URI編碼方法就可以對 URI 進行編碼,它們用特殊的 UTF-8編碼替換所有無效的字元,從而讓瀏覽器能夠接受和理解。其中, encodeURI()主要用於整個URI(例如,http://www.wrox.com/illegal value.htm),而encodeURIComponent()主要用於對URI中的某一段(例如前面
它們的主要區別在於, encodeURI()不會對本身屬於URI的特殊字元進行編碼,例如冒號、正斜槓、問號和井字號;而encodeURIComponent()則會對它發現的任何非標準字元進行編碼。來看下面的例子。
//"http://www.wrox.com/illegal%20value.htm#start"
alert(encodeURI(uri));
//"http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.htm%23start"
alert(encodeURIComponent(uri));
例如,它可將%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-262第3版廢棄的
escape()和unescape()
方法。 URI 方法能夠編碼所有Unicode字元,而原來的方法只能正確地編碼ASCII字元。
因此在開發實踐中,特別是在產品級的程式碼中,一定要使用 URI 方法,不要使用escape()和unescape()方法