標籤:範圍 com 重要 注釋 就會 其他 lin html 字元編碼
javascript中有三個可以對字串編碼的函數,分別是escape、encodeURI、encodeURIComponent,那麼相應的就會有三個對應的解碼函數:unescape、decodeURI、decodeURIComponent。
那麼它們的區別如下:
1 escape()函數
定義和用法
escape() 函數可對字串進行編碼,這樣就可以在所有的電腦上讀取該字串。
文法
escape(string)
參數 描述
string 必需。要被轉義或編碼的字串。
傳回值
已編碼的 string 的副本。其中某些字元被替換成了十六進位的逸出序列。
說明
該方法不會對 ASCII 字母和數字進行編碼,也不會對下面這些 ASCII 標點符號進行編碼: - _ . ! ~ * ‘ ( ) 。其他所有的字元都會被逸出序列替換。
2 encodeURI()函數
定義和用法
encodeURI() 函數可把字串作為 URI 進行編碼。
文法
encodeURI(URIstring)
參數 描述
URIstring 必需。一個字串,含有 URI 或其他要編碼的文本。
傳回值
URIstring 的副本,其中的某些字元將被十六進位的逸出序列進行替換。
說明
該方法不會對 ASCII 字母和數字進行編碼,也不會對這些 ASCII 標點符號進行編碼: - _ . ! ~ * ‘ ( ) 。
該方法的目的是對 URI 進行完整的編碼,因此對以下在 URI 中具有特殊含義的 ASCII 標點符號,encodeURI() 函數是不會進行轉義的:;/?:@&=+$,#
3 encodeURIComponent() 函數
定義和用法
encodeURIComponent() 函數可把字串作為 URI 組件進行編碼。
文法
encodeURIComponent(URIstring)
參數 描述
URIstring 必需。一個字串,含有 URI 組件或其他要編碼的文本。
傳回值
URIstring 的副本,其中的某些字元將被十六進位的逸出序列進行替換。
說明
該方法不會對 ASCII 字母和數字進行編碼,也不會對這些 ASCII 標點符號進行編碼: - _ . ! ~ * ‘ ( ) 。
其他字元(比如 :;/?:@&=+$,# 這些用於分隔 URI 組件的標點符號),都是由一個或多個十六進位的逸出序列替換的。
提示和注釋
提示:請注意 encodeURIComponent() 函數 與 encodeURI() 函數的區別之處,前者假定它的參數是 URI 的一部分(比如協議、主機名稱、路徑或查詢字串)。因此 encodeURIComponent() 函數將轉義用於分隔 URI 各個部分的標點符號。
總結:
一、escape和它們不是同一類
簡單來說,escape是對字串(string)進行編碼(而另外兩種是對URL),作用是讓它們在所有電腦上可讀。
編碼之後的效果是%XX或者%uXXXX這種形式。
其中 ASCII字母 數字 @*/+ 這幾個字元不會被編碼,其餘的都會。
最關鍵的是,當你需要對URL編碼時,請忘記這個方法,這個方法是針對字串使用的,不適用於URL。
二、最常用的encodeURI和encodeURIComponent
對URL編碼是常見的事,所以這兩個方法應該是實際中要特別注意的。
它們都是編碼URL,
唯一區別就是編碼的字元範圍,其中encodeURI方法
不會對下列字元編碼
ASCII字母 數字 [email protected]#$&*()=:/,;?+‘
encodeURIComponent方法
不會對下列字元編碼
ASCII字母 數字 ~!*()‘
所以encodeURIComponent比encodeURI編碼的範圍更大。
實際例子來說,encodeURIComponent會把 http:// 編碼成 http%3A%2F%2F 而encodeURI卻不會。
三、最重要的,什麼場合應該用什麼方法
1、如果只是編碼字串,不和URL有半毛錢關係,那麼用escape。
2、如果你需要編碼整個URL,然後需要使用這個URL,那麼用encodeURI。
比如
encodeURI("http://www.cnblogs.com/season-huang/some other thing");
編碼結果:
"http://www.cnblogs.com/season-huang/some%20other%20thing";
其中,空格被編碼成了%20。但是如果你用了encodeURIComponent,那麼結果變為
"http%3A%2F%2Fwww.cnblogs.com%2Fseason-huang%2Fsome%20other%20thing"
看到了區別嗎,連 "/" 都被編碼了,整個URL已經沒法用了。
3、當你需要編碼URL中的參數的時候,那麼encodeURIComponent是最好方法。
var param = "http://www.cnblogs.com/season-huang/"; //param為參數param = encodeURIComponent(param);var url = "http://www.cnblogs.com?next=" + param;console.log(url) //"http://www.cnblogs.com?next=http%3A%2F%2Fwww.cnblogs.com%2Fseason-huang%2F"
看到了把,參數中的 "/" 可以編碼,如果用encodeURI肯定要出問題,因為後面的/是需要編碼的。
escape()、encodeURI()、encodeURIComponent()區別詳解