javascript encodeURI和encodeURIComponent的比較
更新時(shí)間:2010年04月03日 09:45:54 作者:
在進(jìn)行SaaS前端開(kāi)發(fā)的時(shí)候,大家經(jīng)常會(huì)用到兩個(gè)JavaScriptNative函數(shù):encodeURI 和 encodeURIComponent。這篇文章詳細(xì)解釋這兩個(gè)函數(shù)的用途并比較它們的不同之處
背景
encodeURI 和 encodeURIComponent都是ECMA-262標(biāo)準(zhǔn)中定義的函數(shù),所有兼容這個(gè)標(biāo)準(zhǔn)的語(yǔ)言(如JavaScript, ActionScript)都會(huì)實(shí)現(xiàn)這兩個(gè)函數(shù)。它們都是用來(lái)對(duì)URI (RFC-2396)字符串進(jìn)行編碼的全局函數(shù),但是它們的處理方式和使用場(chǎng)景有所不同。為了解釋它們的不同,我們首先需要理解RFC-2396中對(duì)于URI中的字符分類(lèi)
保留字符(reserved characters):這類(lèi)字符是URI中的保留關(guān)鍵字符,它們用于分割URI中的各個(gè)部分。這些字符是:";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
Mark字符(mark characters):這類(lèi)字符在RFC-2396中特別定義,但是沒(méi)有特別說(shuō)明用途,可能是和別的RFC標(biāo)準(zhǔn)相關(guān)。 這些字符是:"-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
基本字符(alphanum characters):這類(lèi)字符是URI中的主體部分,它包括所有的大寫(xiě)字母、小寫(xiě)字母和數(shù)字
在介紹完上面三類(lèi)字符串后,我們就非常容易來(lái)解釋encodeURI和encodeURIComponent函數(shù)的不同之處了:
encodeURI: 該函數(shù)對(duì)傳入字符串中的所有非(基本字符、Mark字符和保留字符)進(jìn)行轉(zhuǎn)義編碼(escaping)。所有的需要轉(zhuǎn)義的字符都按照UTF-8編碼轉(zhuǎn)化成為一個(gè)、兩個(gè)或者三個(gè)字節(jié)的十六進(jìn)制轉(zhuǎn)義字符(%xx)。例如,字符空格" "轉(zhuǎn)換成為"%20"。在這種編碼模式下面,需要編碼的ASCII字符用一個(gè)字節(jié)轉(zhuǎn)義字符代替,在\u0080和\u007ff之間的字符用兩個(gè)字節(jié)轉(zhuǎn)義字符代替,其他16為Unicode字符用三個(gè)字節(jié)轉(zhuǎn)義字符代替
encodeURIComponent: 該函數(shù)處理方式和encodeURI只有一個(gè)不同點(diǎn),那就是對(duì)于保留字符同樣做轉(zhuǎn)義編碼。例如,字符":"被轉(zhuǎn)義字符"%3A"代替
之所以有上面兩個(gè)不同的函數(shù),是因?yàn)槲覀冊(cè)趯?xiě)JS代碼的時(shí)候?qū)RI進(jìn)行兩種不同的編碼處理需求。encodeURI可以用來(lái)對(duì)完整的URI字符串進(jìn)行編碼處理。而encodeURIComponent可以對(duì)URI中一個(gè)部分進(jìn)行編碼,從而讓這一部分可以包含一些URI保留字符。這在我們?nèi)粘>幊讨惺鞘钟杏玫?。比如下面的URI字符串:
http://www.mysite.com/send-to-friend.aspx?url=http://www.mysite.com/product.html
在這個(gè)URI字符串中。send-to-friend.aspx頁(yè)面會(huì)創(chuàng)建HTML格式的郵件內(nèi)容,里面會(huì)包含一個(gè)鏈接,這個(gè)鏈接的地址就是上面URI字符串中的url值。顯然上面的url值是URI中的一個(gè)部分,里面包含了URI保留關(guān)鍵字符。我們必須調(diào)用encodeURIComponent對(duì)它進(jìn)行編碼后使用,否則上面的URI字符串會(huì)被瀏覽器認(rèn)為是一個(gè)無(wú)效的URI。正確的URI應(yīng)該如下:
http://www.mysite.com/send-to-friend.aspx?url=http%3A%2F%2Fwww.mysite.com%2Fproduct.html
例子
encodeURI
var uri="my test.asp?name=ståle&car=saab";
document.write(encodeURI(uri));
上面的輸出如下:
my%20test.asp?name=st%C3%A5le&car=saab
encodeURIComponent
var uri="http://jb51.net/my test.asp?name=ståle&car=saab";
document.write(encodeURIComponent(uri));
上面的輸出如下:
http%3A%2F%2Fjb51.net%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab
其他
在ECMA-262標(biāo)準(zhǔn)中還定義了和這兩個(gè)encode函數(shù)向?qū)?yīng)的decode全局函數(shù),它們是decodeURI和decodeURIComponent。我們可以用它們來(lái)decode編碼后的字符串
encodeURI 和 encodeURIComponent都是ECMA-262標(biāo)準(zhǔn)中定義的函數(shù),所有兼容這個(gè)標(biāo)準(zhǔn)的語(yǔ)言(如JavaScript, ActionScript)都會(huì)實(shí)現(xiàn)這兩個(gè)函數(shù)。它們都是用來(lái)對(duì)URI (RFC-2396)字符串進(jìn)行編碼的全局函數(shù),但是它們的處理方式和使用場(chǎng)景有所不同。為了解釋它們的不同,我們首先需要理解RFC-2396中對(duì)于URI中的字符分類(lèi)
保留字符(reserved characters):這類(lèi)字符是URI中的保留關(guān)鍵字符,它們用于分割URI中的各個(gè)部分。這些字符是:";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
Mark字符(mark characters):這類(lèi)字符在RFC-2396中特別定義,但是沒(méi)有特別說(shuō)明用途,可能是和別的RFC標(biāo)準(zhǔn)相關(guān)。 這些字符是:"-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
基本字符(alphanum characters):這類(lèi)字符是URI中的主體部分,它包括所有的大寫(xiě)字母、小寫(xiě)字母和數(shù)字
在介紹完上面三類(lèi)字符串后,我們就非常容易來(lái)解釋encodeURI和encodeURIComponent函數(shù)的不同之處了:
encodeURI: 該函數(shù)對(duì)傳入字符串中的所有非(基本字符、Mark字符和保留字符)進(jìn)行轉(zhuǎn)義編碼(escaping)。所有的需要轉(zhuǎn)義的字符都按照UTF-8編碼轉(zhuǎn)化成為一個(gè)、兩個(gè)或者三個(gè)字節(jié)的十六進(jìn)制轉(zhuǎn)義字符(%xx)。例如,字符空格" "轉(zhuǎn)換成為"%20"。在這種編碼模式下面,需要編碼的ASCII字符用一個(gè)字節(jié)轉(zhuǎn)義字符代替,在\u0080和\u007ff之間的字符用兩個(gè)字節(jié)轉(zhuǎn)義字符代替,其他16為Unicode字符用三個(gè)字節(jié)轉(zhuǎn)義字符代替
encodeURIComponent: 該函數(shù)處理方式和encodeURI只有一個(gè)不同點(diǎn),那就是對(duì)于保留字符同樣做轉(zhuǎn)義編碼。例如,字符":"被轉(zhuǎn)義字符"%3A"代替
之所以有上面兩個(gè)不同的函數(shù),是因?yàn)槲覀冊(cè)趯?xiě)JS代碼的時(shí)候?qū)RI進(jìn)行兩種不同的編碼處理需求。encodeURI可以用來(lái)對(duì)完整的URI字符串進(jìn)行編碼處理。而encodeURIComponent可以對(duì)URI中一個(gè)部分進(jìn)行編碼,從而讓這一部分可以包含一些URI保留字符。這在我們?nèi)粘>幊讨惺鞘钟杏玫?。比如下面的URI字符串:
http://www.mysite.com/send-to-friend.aspx?url=http://www.mysite.com/product.html
在這個(gè)URI字符串中。send-to-friend.aspx頁(yè)面會(huì)創(chuàng)建HTML格式的郵件內(nèi)容,里面會(huì)包含一個(gè)鏈接,這個(gè)鏈接的地址就是上面URI字符串中的url值。顯然上面的url值是URI中的一個(gè)部分,里面包含了URI保留關(guān)鍵字符。我們必須調(diào)用encodeURIComponent對(duì)它進(jìn)行編碼后使用,否則上面的URI字符串會(huì)被瀏覽器認(rèn)為是一個(gè)無(wú)效的URI。正確的URI應(yīng)該如下:
http://www.mysite.com/send-to-friend.aspx?url=http%3A%2F%2Fwww.mysite.com%2Fproduct.html
例子
encodeURI
復(fù)制代碼 代碼如下:
var uri="my test.asp?name=ståle&car=saab";
document.write(encodeURI(uri));
上面的輸出如下:
my%20test.asp?name=st%C3%A5le&car=saab
encodeURIComponent
復(fù)制代碼 代碼如下:
var uri="http://jb51.net/my test.asp?name=ståle&car=saab";
document.write(encodeURIComponent(uri));
上面的輸出如下:
http%3A%2F%2Fjb51.net%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab
其他
在ECMA-262標(biāo)準(zhǔn)中還定義了和這兩個(gè)encode函數(shù)向?qū)?yīng)的decode全局函數(shù),它們是decodeURI和decodeURIComponent。我們可以用它們來(lái)decode編碼后的字符串
您可能感興趣的文章:
- javascript HTMLEncode HTMLDecode的完整實(shí)例(兼容ie和火狐)
- php中json_decode()和json_encode()的使用方法
- js中encode、decode的應(yīng)用說(shuō)明
- 淺析php中json_encode()和json_decode()
- JS中encodeURIComponent函數(shù)用php解碼的代碼
- php數(shù)組轉(zhuǎn)換js數(shù)組操作及json_encode的用法詳解
- JS的encodeURI和java的URLDecoder.decode使用介紹
- php中json_encode UTF-8中文亂碼的更好解決方法
- JS對(duì)URL字符串進(jìn)行編碼/解碼分析
- javascript另類(lèi)方法實(shí)現(xiàn)htmlencode()與htmldecode()函數(shù)實(shí)例分析
相關(guān)文章
解決layui的radio屬性或別的屬性沒(méi)顯示出來(lái)的問(wèn)題
今天小編就為大家分享一篇解決layui的radio屬性或別的屬性沒(méi)顯示出來(lái)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09
CSS和Javascript簡(jiǎn)單復(fù)習(xí)資料
CSS和Javascript簡(jiǎn)單復(fù)習(xí)資料,學(xué)習(xí)css與js的朋友可以參考下。2010-06-06
JS焦點(diǎn)圖,JS 多個(gè)頁(yè)面放多個(gè)焦點(diǎn)圖的實(shí)例
下面小編就為大家?guī)?lái)一篇JS焦點(diǎn)圖,JS 多個(gè)頁(yè)面放多個(gè)焦點(diǎn)圖的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12
javascript中的replace函數(shù)(帶注釋demo)
在js中有兩個(gè)replace函數(shù) 一個(gè)是location.replace(url) 跳轉(zhuǎn)到一個(gè)新的url.一個(gè)string.replace("xx","yy") 替換字符串 返回一個(gè)新的字符串,該方法并不改變字符串本身。下面通過(guò)本文給大家介紹javascript中的replace函數(shù)2018-01-01
JavaScript, select標(biāo)簽元素左右移動(dòng)功能實(shí)現(xiàn)
這篇文章主要介紹了JavaScript, select標(biāo)簽元素左右移動(dòng)功能實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
微信小程序獲取手機(jī)系統(tǒng)信息的方法【附源碼下載】
這篇文章主要介紹了微信小程序獲取手機(jī)系統(tǒng)信息的方法,涉及微信小程序wx.getSystemInfo函數(shù)的簡(jiǎn)單使用技巧,并附帶源碼供讀者下載參考,需要的朋友可以參考下2017-12-12
基于JS實(shí)現(xiàn)類(lèi)似支付寶支付密碼輸入框
這篇文章主要介紹了基于JS實(shí)現(xiàn)類(lèi)似支付寶支付密碼輸入框功能,密碼框只準(zhǔn)輸入數(shù)字且只可以輸入6位數(shù)字,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09

