url特殊字符編碼encodeURI?VS?encodeURIComponent分析
encodeURI VS encodeURIComponent
用于給url
中的特殊字符進(jìn)行編碼。
為什么要用?
因?yàn)榫W(wǎng)絡(luò)標(biāo)準(zhǔn)RFC1738
做了硬性規(guī)定,只有字符和數(shù)字以及一些規(guī)定內(nèi)的特殊符號(hào),才可以不經(jīng)過編碼用于url
,換言之就是,如果你的url
中包含了規(guī)定之外的符號(hào),那它就是非法的url
, 無法被服務(wù)器解析,也就無法訪問到你想要的網(wǎng)絡(luò)資源。
為了解決這個(gè)問題,js
就提供了encodeURI
和encodeURIComponent
來給這些規(guī)定之外的符號(hào)進(jìn)行編碼,這樣,服務(wù)器就能正常解析并訪問了。
用法?
encodeURI
encodeURI()會(huì)編碼除去ASCII碼、數(shù)字和~!@#$&*()=:/,;?+.-_'
之外的所有字符。
const url = 'http://www.test.com/images/花朵.png' const nextUrl = encodeURI(url) // http://www.test.com/images/%E8%8A%B1%E6%9C%B5.png
encodeURIComponent
encodeURIComponent()會(huì)編碼除去ASCII碼、數(shù)字和~!*().-_'
之外的所有字符。
const url = 'http://www.test.com/images/花朵.png' const nextUrl = encodeURIComponent(url) // http%3A%2F%2Fwww.test.com%2Fimages%2F%E8%8A%B1%E6%9C%B5.png
兩者之間的差異
encodeURIComponent會(huì)進(jìn)行編碼的字符范圍比encodeURI大。
兩者之間如何選用
由于兩者之間唯一的差異就是可被編碼的字符范圍,所以需要根據(jù)實(shí)際需要編碼的字符做抉擇。
情況1:
const url = 'http://www.test.com/images/花朵.png' console.log(encodeURI(url)); http://www.test.com/images/%E8%8A%B1%E6%9C%B5.png console.log(encodeURIComponent(url)); http%3A%2F%2Fwww.test.com%2Fimages%2F%E8%8A%B1%E6%9C%B5.png
通過上面的示例我們發(fā)現(xiàn),由于encodeURIComponent
的編碼范圍很廣,如果對整個(gè)URL
調(diào)用,會(huì)導(dǎo)致URL
中有特殊作用的符號(hào)被編碼,變成一個(gè)非法的URL
了,也就無法訪問了。所以此種情況應(yīng)該選用encodeURI
。
情況2:
const name = 'AT&T'; console.log(encodeURI(name)); // AT&T console.log(encodeURIComponent(name)); // AT%26T
由于encodeURI
的編碼范圍較小,導(dǎo)致此處我們希望被編碼的&
并沒有被編碼。所以此種情況應(yīng)該選用encodeURIComponent
。
應(yīng)用場景
場景1:
url參數(shù)中包含特殊字符
// 美國電話電報(bào)公司 const name = 'AT&T'; const url = `http://www.test.com?name=${name}`; const nextUrl = new URL(url); const search = new URLSearchParams(nextUrl.search); console.log(search.get('name')); // AT
輸出的結(jié)果缺少了一部分,這是因?yàn)?code>&是一個(gè)標(biāo)準(zhǔn)的url
參數(shù)分割符,所以會(huì)被解析為分割符。雖然如此,但本例中的&
符號(hào)是屬于名字的一部分,我們不想讓它被解析為url
的參數(shù)分隔符。這時(shí)我們就可以使用encodeURIComponent
對name
的值進(jìn)行編碼,這樣&
就不會(huì)被識(shí)別為參數(shù)分割符了
// 美國電話電報(bào)公司 const name = 'AT&T'; const url = `http://www.test.com?name=${encodeURIComponent(name)}`; const nextUrl = new URL(url); const search = new URLSearchParams(nextUrl.search); console.log(search.get('name')); // AT&T
場景2:
將一個(gè)回調(diào)地址作為參數(shù)附加在另一個(gè)地址上
const redirectUrl = 'http://www.result.com?type=success&num=10'; const targetUrl = `http://www.test.com?redirectUrl=${redirectUrl}`; const url = new URL(targetUrl); const search = new URLSearchParams(url.search); console.log(search.get('redirectUrl')); // http://www.result.com?type=success
我們獲取redirectUrl
參數(shù)時(shí),會(huì)發(fā)現(xiàn)num
參數(shù)丟失了,這是因?yàn)?code>&被當(dāng)成www.test.com
的參數(shù)分隔符了,這里我們可以使用encodeURIComponent
來對redirectUrl
進(jìn)行編碼就能解決這個(gè)問題。
const redirectUrl = 'http://www.result.com?type=success&num=10'; const targetUrl = `http://www.test.com?redirectUrl=${encodeURIComponent(redirectUrl)}`; const url = new URL(targetUrl); const search = new URLSearchParams(url.search); console.log(search.get('redirectUrl')); // http://www.result.com?type=success&num=10
疑問
現(xiàn)代瀏覽器會(huì)自動(dòng)識(shí)別URL
中的特殊字符并將其編碼,那還需要我們手動(dòng)調(diào)用encodeURI
和encodeURIComponent
嗎?
答案是看情況,比如在參數(shù)中有中文的情況下,中文在URL
中不會(huì)有歧義(中文在URL
中不會(huì)有其它含義),所以瀏覽器會(huì)幫你完成編碼,但是,在有些情況下,瀏覽器是不知道你是否需要編碼的,我們拿前面的一個(gè)示例:
// 美國電話電報(bào)公司 const name = 'AT&T';
這里的&
在URL
中有兩種含義,一是作為參數(shù)分割符,二是作為普通的字符,這時(shí),瀏覽器無法猜測你的意圖,也就不會(huì)幫你自動(dòng)編碼了,所以,還是需要你主動(dòng)調(diào)用encodeURIComponent
。
注意事項(xiàng)
- 他們對特殊字符的編碼形式是
utf-8
以上就是url特殊字符編碼encodeURI VS encodeURIComponent分析的詳細(xì)內(nèi)容,更多關(guān)于url特殊字符編碼的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript輸入分鐘、秒倒計(jì)時(shí)技巧總結(jié)(附代碼)
這篇文章主要介紹了JavaScript輸入分鐘、秒倒計(jì)時(shí)的代碼實(shí)現(xiàn),通過css和js代碼展示了邏輯過程,具體操作步驟大家可查看下文的詳細(xì)講解,感興趣的小伙伴們可以參考一下。2017-08-08原生js三級(jí)聯(lián)動(dòng)的簡單實(shí)現(xiàn)代碼
下面小編就為大家?guī)硪黄鷍s三級(jí)聯(lián)動(dòng)的簡單實(shí)現(xiàn)代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06js setTimeout實(shí)現(xiàn)延遲關(guān)閉彈出層
有時(shí)候我們希望彈出層能夠?qū)崿F(xiàn)延遲關(guān)閉,并且鼠標(biāo)在彈出層區(qū)域移動(dòng)的時(shí)候能夠保持顯現(xiàn),下面是具體的實(shí)現(xiàn)代碼。2010-04-04使用pdf-lib.js實(shí)現(xiàn)pdf添加自定義水印功能
pdf-lib是一個(gè)強(qiáng)大的JavaScript庫,允許在任何JavaScript環(huán)境中創(chuàng)建和修改PDF文檔,下面就跟隨小編一起來學(xué)習(xí)一下如何使用pdf-lib實(shí)現(xiàn)pdf添加自定義水印功能吧2024-11-11