欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

url特殊字符編碼encodeURI?VS?encodeURIComponent分析

 更新時(shí)間:2023年09月26日 11:55:23   作者:熱飯班長  
這篇文章主要介紹了url特殊字符編碼encodeURI?VS?encodeURIComponent分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

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就提供了encodeURIencodeURIComponent來給這些規(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í)我們就可以使用encodeURIComponentname的值進(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)用encodeURIencodeURIComponent嗎?
答案是看情況,比如在參數(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)文章

  • js 獲取、清空input type=

    js 獲取、清空input type=

    本篇文章主要是對js獲取、清空input type="file"的值的示例代碼進(jìn)行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-02-02
  • JavaScript輸入分鐘、秒倒計(jì)時(shí)技巧總結(jié)(附代碼)

    JavaScript輸入分鐘、秒倒計(jì)時(shí)技巧總結(jié)(附代碼)

    這篇文章主要介紹了JavaScript輸入分鐘、秒倒計(jì)時(shí)的代碼實(shí)現(xiàn),通過css和js代碼展示了邏輯過程,具體操作步驟大家可查看下文的詳細(xì)講解,感興趣的小伙伴們可以參考一下。
    2017-08-08
  • JavaScript字符串常用類使用方法匯總

    JavaScript字符串常用類使用方法匯總

    今天的這篇文章就分享幾年以來總結(jié)的一些最常見和最有用的字符串相關(guān)的方法的例子和簡要說明。便于程序員用于快速參考。當(dāng)然,最有經(jīng)驗(yàn)的開發(fā)人員對這些操作很熟悉,但我認(rèn)為這是一個(gè)很好的方法幫助初學(xué)者理解這些函數(shù),他可以幫助你使用簡單的語法,完成復(fù)雜的操作.
    2015-04-04
  • JavaScript對象引用與賦值實(shí)例詳解

    JavaScript對象引用與賦值實(shí)例詳解

    這篇文章主要介紹了JavaScript對象引用與賦值,結(jié)合實(shí)例形式分析了JavaScript對象引用及賦值的操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-03-03
  • Javascript中replace()小結(jié)

    Javascript中replace()小結(jié)

    在javascript中,replace方法是屬于String對象的,可用于替換字符串。今天我們就來詳細(xì)探討下一些replace()方法的使用
    2015-09-09
  • 原生js三級(jí)聯(lián)動(dòng)的簡單實(shí)現(xiàn)代碼

    原生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-06
  • js setTimeout實(shí)現(xiàn)延遲關(guān)閉彈出層

    js 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
  • js中比較兩個(gè)對象是否相同的方法示例

    js中比較兩個(gè)對象是否相同的方法示例

    這篇文章主要介紹了js中比較兩個(gè)對象是否相同的方法,結(jié)合實(shí)例形式詳細(xì)分析了js對象遍歷、判斷等相關(guān)操作技巧,需要的朋友可以參考下
    2019-09-09
  • javascript連續(xù)賦值問題

    javascript連續(xù)賦值問題

    本文通過具體的示例來給大家詳細(xì)解釋了下javascript的連續(xù)賦值問題,十分的實(shí)用,有需要的小伙伴可以參考下。
    2015-07-07
  • 使用pdf-lib.js實(shí)現(xiàn)pdf添加自定義水印功能

    使用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

最新評(píng)論