在介紹encodeURI()、encodeURIComponent()、decodeURI()、decodeURIComponent()方法前我們需要了解Global對象的概念:
Global(全局)對象可以說是ECMAScript中最特別的一個對象了,因為不管你從什么角度上看,這個對象都是不存在的。ECMAScript中的Global對象在某種意義上是作為一個終極的“兜底兒對象”來定義的。換句話說,不屬於任何其他對象的屬性和方法,最終都是它的屬性和方法。事實上,沒有全局變量或全局函數;所有在全局作用域中定義的屬性和函數,都是Global對象的屬性。本書前面介紹過的那些函數,諸如isNaN()、isFinite()、parselnt()以及parseFloat(),實際上全都是Global對象昀方法。除此之外,Global對象還包含其他一些方法。
URI編碼方法
Global對象的encodeURI()和encodeURIComponent()方法可以對URI (Uniform ResourceIdentifiers,通用資源標識符)進行編碼,以便發送給瀏覽器。有效的URI中不能包含某些字符,例如空格。而這URI編碼方法就可以對URI進行編碼,它們用特殊的UTF-8編碼替換所有無效的字 符,從而讓瀏覽器能夠接受和理解。
其中encodeURI()主要用於整個URI(例如,http://www.mofeimedia.com/illegal value.htm),而encode-URIComponent()主要用於對URI中的某一段(例如前面URI中的illegal value.htm)進行編碼。它們的主要區別在於,encodeURI()不會對本身屬於URI的特殊字符進行編碼,例如冒號、正斜杠、問號和井字號;而encodeURIComponent()則會對它發現的任何非標准字符進行編碼。來看下面的例子:
var uri="http://www.mofeimedia.com/illegal value.htm#start";
//”http: //www.mofeimedia.com/illegal%20value .htm#s tart”
alert(encodeURI (uri)):
//”http% 3A%2F%2Fwww.mofeimedia.com%2 Fillegal%2 0value. htm%23 start”
alert( encodaURIComponent (uri));
使用encodeURI()編碼后的結果是除了空格之外的其他字符都原封不動,只有空格被替換成了%20。而encodeURIComponent()方法則會使用對應的編碼替換所有非字母數字字符。這也正是可以對整個URI使用encodeURI(),而只能對附加在現有URI后面的字符串使用encodeURIComponent()的原因所在。一般來說,我們使用encodeURIComponent()方法的時候要比使用encodeURI()更多,因為在實踐中更常見的是對查詢字符串參數而不是對基礎URL進行編碼.
與encodeURI()和encodeURIComponent()方法對應的兩個方法分別是decodeURI()和decodeURIComponent()。其中,decodeURI()只能對使用encodeURI()替換的字符進行解碼。例如, 它可將%20替換成一個空格,但不會對%23作任何處理,因為%23表示井字號(#),而井字號不是使用encodeUR工()替換的。同樣地,decodeURIComponent()能夠解碼使用encodeURIComponent()編碼的所有字符,即它可以解碼任何特殊字符的編碼。來看下面的例子:
var uri=”http%3A%2F%2Fwww.mofeimedia.com%2Fillegal%2 0value.htm%23 start”;
//http% 3A%2F%2Fwww. jxbh.cn%2 Fillegal value .htm%23 start
alert( decodeURI(uri));
//http: //www.mofeimedia.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()方法.