url的三个js编码函数escape(),encodeURI(),encodeURIComponent()简介
轉(zhuǎn)載地址:http://www.haorooms.com/post/js_escape_encodeURIComponent
引子
瀏覽器URl地址,上網(wǎng)一定會(huì)用到,但是瀏覽器地址有中文或者瀏覽器url參數(shù)操作的時(shí)候,經(jīng)常會(huì)用到encodeURIComponent()和decodeURIComponent()以及encodeURI()等等。關(guān)于瀏覽器參數(shù)操作,請(qǐng)看文章http://www.haorooms.com/post/js_url_canshu ,今天主要講講escape(),encodeURI(),encodeURIComponent()這幾個(gè)函數(shù)的用法和區(qū)別。
為啥會(huì)有瀏覽器編碼這一說法
一般來說,URL只能使用英文字母、阿拉伯?dāng)?shù)字和某些標(biāo)點(diǎn)符號(hào),不能使用其他文字和符號(hào)。比如,世界上有英文字母的網(wǎng)址 “h ttp://www.haorooms.com”,但是沒有希臘字母的網(wǎng)址“h ttp://www.aβγ.com”(讀作阿爾法-貝塔-伽瑪.com)。這是因?yàn)榫W(wǎng)絡(luò)標(biāo)準(zhǔn)RFC 1738做了硬性規(guī)定:
原文:"...Only alphanumerics [0-9a-zA-Z], the special characters "$-_.+!*'()," [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL."翻譯:“只有字母和數(shù)字[0-9a-zA-Z]、一些特殊符號(hào)“$-_.+!*'(),”[不包括雙引號(hào)]、以及某些保留字,才可以不經(jīng)過編碼直接用于URL。”
這意味著,如果URL中有漢字,就必須編碼后使用。但是麻煩的是,RFC 1738沒有規(guī)定具體的編碼方法,而是交給應(yīng)用程序(瀏覽器)自己決定。這導(dǎo)致“URL編碼”成為了一個(gè)混亂的領(lǐng)域。
下面我們通過介紹escape(),encodeURI(),encodeURIComponent()來說說Javascript瀏覽器編碼方法。
出現(xiàn)瀏覽器編碼的幾種情況
1、網(wǎng)址路徑中包含漢字
如下圖:
h ttp://www.haorooms.com/您好,在瀏覽器中顯示的是h ttp://www.haorooms.com/%E6%82%A8%E5%A5%BD 自動(dòng)對(duì)“你好”進(jìn)行了編碼。要是我們?yōu)g覽器地址中有中文的時(shí)候,就要用到url編碼了。
2、查詢字符串包含漢字
http://www.haorooms.com/search?keywords=您好這樣包含查詢的的條件的時(shí)候,漢字也會(huì)被編碼。
3、Get方法生成的URL包含漢字
前面說的是直接輸入網(wǎng)址的情況,但是更常見的情況是,在已打開的網(wǎng)頁(yè)上,直接用Get或Post方法發(fā)出HTTP請(qǐng)求。
根據(jù)臺(tái)灣中興大學(xué)呂瑞麟老師的試驗(yàn),這時(shí)的編碼方法由網(wǎng)頁(yè)的編碼決定,也就是由HTML源碼中字符集的設(shè)定決定。
<meta http-equiv="Content-Type" content="text/html;charset=xxxx">如果上面這一行最后的charset是UTF-8,則URL就以UTF-8編碼;如果是GB2312,URL就以GB2312編碼。
舉例來說,百度是GB2312編碼,Google是UTF-8編碼。因此,從它們的搜索框中搜索同一個(gè)詞“春節(jié)”,生成的查詢字符串是不一樣的。
百度生成的是%B4%BA%BD%DA,這是GB2312編碼。Google生成的是%E6%98%A5%E8%8A%82,這是UTF-8編碼。所以,結(jié)論3就是,GET和POST方法的編碼,用的是網(wǎng)頁(yè)的編碼。
4、Ajax調(diào)用的URL包含漢字
前面三種情況都是由瀏覽器發(fā)出HTTP請(qǐng)求,最后一種情況則是由Javascript生成HTTP請(qǐng)求,也就是Ajax調(diào)用。還是根據(jù)呂瑞麟老師的文章,在這種情況下,IE和Firefox的處理方式完全不一樣。
舉例來說,有這樣兩行代碼:
url = url + "?q=" +document.myform.elements[0].value; // 假定用戶在表單中提交的值是“春節(jié)”這兩個(gè)字http_request.open('GET', url, true);那么,無(wú)論網(wǎng)頁(yè)使用什么字符集,IE傳送給服務(wù)器的總是“q=%B4%BA%BD%DA”,而Firefox傳送給服務(wù)器的總是“q=%E6%98%A5%E8%8A%82”。也就是說,在Ajax調(diào)用中,IE總是采用GB2312編碼(操作系統(tǒng)的默認(rèn)編碼),而Firefox總是采用utf-8編碼。
瀏覽器編碼的函數(shù)簡(jiǎn)介escape(),encodeURI(),encodeURIComponent()
1、escape()
escape()是js編碼函數(shù)中最古老的一個(gè)。雖然這個(gè)函數(shù)現(xiàn)在已經(jīng)不提倡使用了,但是由于歷史原因,很多地方還在使用它,所以有必要先從它講起。
實(shí)際上,escape()不能直接用于URL編碼,它的真正作用是返回一個(gè)字符的Unicode編碼值。比如“春節(jié)”的返回結(jié)果是%u6625%u8282,也就是說在Unicode字符集中,“春”是第6625個(gè)(十六進(jìn)制)字符,“節(jié)”是第8282個(gè)(十六進(jìn)制)字符。
例如:
javascript:escape("春節(jié)"); //輸出 "%u6625%u8282"javascript:escape("hello word"); //輸出 "hello%20word"還有兩個(gè)地方需要注意。
首先,無(wú)論網(wǎng)頁(yè)的原始編碼是什么,一旦被Javascript編碼,就都變?yōu)閡nicode字符。也就是說,Javascipt函數(shù)的輸入和輸出,默認(rèn)都是Unicode字符。這一點(diǎn)對(duì)下面兩個(gè)函數(shù)也適用。
javascript:escape("\u6625\u8282"); //輸出 "%u6625%u8282"javascript:unescape("%u6625%u8282"); //輸出 "春節(jié)"javascript:unescape("\u6625\u8282"); //輸出 "春節(jié)"其次,escape()不對(duì)“+”編碼。但是我們知道,網(wǎng)頁(yè)在提交表單的時(shí)候,如果有空格,則會(huì)被轉(zhuǎn)化為+字符。服務(wù)器處理數(shù)據(jù)的時(shí)候,會(huì)把+號(hào)處理成空格。所以,使用的時(shí)候要小心。
2、encodeURI()
它著眼于對(duì)整個(gè)URL進(jìn)行編碼,因此除了常見的符號(hào)以外,對(duì)其他一些在網(wǎng)址中有特殊含義的符號(hào)“; / ? : @ & = + $ , #”,也不進(jìn)行編碼。編碼后,它輸出符號(hào)的utf-8形式,并且在每個(gè)字節(jié)前加上%。
它對(duì)應(yīng)的解碼函數(shù)是decodeURI()。
需要注意的是,它不對(duì)單引號(hào)'編碼。
3、encodeURIComponent()
最后一個(gè)Javascript編碼函數(shù)是encodeURIComponent()。與encodeURI()的區(qū)別是,它用于對(duì)URL的組成部分進(jìn)行個(gè)別編碼,而不用于對(duì)整個(gè)URL進(jìn)行編碼。
因此,“; / ? : @ & = + $ , #”,這些在encodeURI()中不被編碼的符號(hào),在encodeURIComponent()中統(tǒng)統(tǒng)會(huì)被編碼。至于具體的編碼方法,兩者是一樣。
它對(duì)應(yīng)的解碼函數(shù)是decodeURIComponent()。
encodeURIComponent()相比encodeURI()要更加徹底。
例如:
<html> <body><script type="text/javascript">var test1="http://www.haorooms.com/My first/"; var nn=encodeURI(test1); var now=decodeURI(test1);var test1="http://www.haorooms.com/My first/"; var bb=encodeURIComponent(test1); var nnow=decodeURIComponent(bb);</script></body> </html>輸出結(jié)果是:
http://www.haorooms.com/My%20first/ http://www.haorooms.com/My first/ http%3A%2F%2Fwww.haorooms.com%2FMy%20first%2F http://www.haorooms.com/My first/總結(jié)
escape()不能直接用于URL編碼,它的真正作用是返回一個(gè)字符的Unicode編碼值。比如"春節(jié)"的返回結(jié)果是%u6625%u8282,,escape()不對(duì)"+"編碼主要用于漢字編碼,現(xiàn)在已經(jīng)不提倡使用。
encodeURI()是Javascript中真正用來對(duì)URL編碼的函數(shù)。編碼整個(gè)url地址,但對(duì)特殊含義的符號(hào)"; / ? : @ & = + $ , #",也不進(jìn)行編碼。對(duì)應(yīng)的解碼函數(shù)是:decodeURI()。
encodeURIComponent()能編碼"; / ? : @ & = + $ , #"這些特殊字符。對(duì)應(yīng)的解碼函數(shù)是decodeURIComponent()。
假如要傳遞帶&符號(hào)的網(wǎng)址,所以用encodeURIComponent()
轉(zhuǎn)載于:https://www.cnblogs.com/archermeng/p/7537203.html
總結(jié)
以上是生活随笔為你收集整理的url的三个js编码函数escape(),encodeURI(),encodeURIComponent()简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MongoDB windows解压缩版安
- 下一篇: Object: