escape()、encodeURI()、encodeURIComponent()區別詳解

來源:互聯網
上載者:User

標籤:範圍   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()區別詳解

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.