URL编码总结
URL編碼總結(jié)
? ? ? ? ??URL是Universal Resource Locator的簡(jiǎn)稱。翻譯過來那就是統(tǒng)一資源定位符,好吧,我們常常會(huì)俗稱為網(wǎng)頁地址。
一個(gè)URL的格式一般是這種:協(xié)議類型://server地址(必要時(shí)需加上port號(hào))/路徑/文件名稱?參數(shù)。比方http://zh.wikipedia.org:80/w/index.php?title=Special,協(xié)議是HTTP。server地址是zh.wikipedia.org,port是80,路徑和文件名稱是/w/index.php。參數(shù)是title=Special。還有個(gè)與URL相關(guān)的概念URI。URI是統(tǒng)一資源標(biāo)示符,URL是URI的一種,用于標(biāo)示互聯(lián)網(wǎng)資源,并指定了對(duì)資源的操作和獲取方法。URL大部分情況下都僅僅有英文字符,這樣也就不存在編碼問題。假設(shè)URL中有了中文。那么編碼規(guī)則是什么呢?實(shí)際上,RFC并沒有標(biāo)準(zhǔn)規(guī)定URL的編碼方式,所以不同的瀏覽器的表現(xiàn)可能是不同的。以下就總結(jié)下。主要參考了阮一峰的關(guān)于URL編碼一文,當(dāng)然有些地方我測(cè)試的結(jié)果會(huì)有所不同,大家能夠依據(jù)自己的系統(tǒng)環(huán)境進(jìn)行區(qū)分。
1 URL路徑中包括中文
? ? ? ?假設(shè)URL路徑中包括中文,經(jīng)過測(cè)試發(fā)現(xiàn)無論IE6.0還是Chrome。編碼都是採用的UTF-8。其它瀏覽器臨時(shí)沒有測(cè)試。猜想應(yīng)該一致。
? ? ? ?測(cè)試的URL是:http://zh.wikipedia.org/wiki/中文.在chrome的開發(fā)人員工具中能夠看到實(shí)際的URL是http://zh.wikipedia.org/wiki/%E4%B8%AD%E6%96%87,當(dāng)中E4B8AD E69687正是"中文"的UTF-8編碼。
2 URL查詢參數(shù)中包括中文
? ? ? ?假設(shè)查詢參數(shù)中包括中文。則經(jīng)過測(cè)試發(fā)現(xiàn),IE6.0採用的是操作系統(tǒng)編碼,Chrome採用的是UTF-8編碼。
? ? ? ?測(cè)試的URL是:http://www.baidu.com/s?wd=中文。通過測(cè)試能夠發(fā)現(xiàn)。在IE6以下“中文”實(shí)際被轉(zhuǎn)成了%B0%D9%B6%C8。chrome以下則轉(zhuǎn)成了%E4%B8%AD%E6%96%87。
3 表單參數(shù)的中文編碼
? ? ? ?表單提交時(shí),無論是IE6還是Chrome,參數(shù)中中文的編碼則依據(jù)HTML代碼中指定的字符編碼來決定(也就是html代碼中標(biāo)簽指定的字符編碼)。
當(dāng)然這是在form中沒有指定accept-charset的情況下,假設(shè)form中加了accept-charset="GBK”屬性,則表單參數(shù)則由accept-charset指定編碼進(jìn)行編碼。
? ? ? ?測(cè)試代碼例如以下:
<html> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>測(cè)試</title> </head> <body> <h2>表單中文編碼測(cè)試</h2> <form method="GET" action="http://www.baidu.com/s"> <input type="text" name="wd"> <input type="submit" value="OK"> </form> </body> </html>? ? ? ?能夠發(fā)現(xiàn),當(dāng)指定charset=UTF-8時(shí),你在輸入項(xiàng)輸入“中文”。則實(shí)際提交后會(huì)用UTF-8編碼成%E4%B8%AD%E6%96%87,而假設(shè)charset=GBK。則輸入項(xiàng)會(huì)用GBK編碼成%D6%D0%CE%C4。
用POST方法也是一樣的。
? ? ? ?而假設(shè)加上accept-charset屬性。代碼改成以下這樣。則表單參數(shù)編碼由accept-charset中指定的編碼來決定。
例如以下所看到的,盡管meta中指定的是UTF-8編碼。可是表單參數(shù)是GBK編碼的。
<html> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>測(cè)試</title> </head> <body> <h2>表單中文編碼測(cè)試</h2> <form method="GET" action="http://www.baidu.com/s" accept-charset="GBK"> <input type="text" name="wd"> <input type="submit" value="OK"> </form> </body> </html>另一點(diǎn)須要注意的是,假設(shè)輸入項(xiàng)包括空格,比方“中文 哈哈”,則空格會(huì)被編碼為+。4 Javascript HTTP的中文參數(shù)編碼
? ? ? ?之前說的是直接通過瀏覽器發(fā)HTTP請(qǐng)求的中文編碼情況,那假設(shè)是通過Javascript發(fā)送HTTP請(qǐng)求,會(huì)是什么情況呢?依據(jù)測(cè)試發(fā)現(xiàn),通過Javascript發(fā)送的HTTP請(qǐng)求。IE6的為操作系統(tǒng)編碼。Chrome中文參數(shù)編碼是UTF-8。
? ? ? ?測(cè)試:能夠打開Chrome的http://zh.wikipedia.org/wiki/%E4%B8%AD%E6%96%87。在開發(fā)人員工具的控制臺(tái)輸入$.ajax("/wiki/英語"),能夠在網(wǎng)絡(luò)連接中發(fā)現(xiàn)"英語"採用的UTF-8編碼。IE中能夠另外編輯一個(gè)測(cè)試的網(wǎng)頁,用JS測(cè)試就可以。
5 Javascript編碼函數(shù)
? ? ? ?前面說的非常多種中文編碼情況。不同的瀏覽器處理方式也不盡同樣。這是件非常糾結(jié)的事情,一個(gè)好的方法是採用JS的函數(shù)在表單提交前對(duì)參數(shù)進(jìn)行統(tǒng)一處理。
? ? ? ?第一個(gè)函數(shù)是escape,escape是一個(gè)全局函數(shù)。它使用十六進(jìn)制的數(shù)字(%xx或%uxxxx)編碼字符串為unicode碼。
小于等于0xFF的字符將被轉(zhuǎn)義為%xx。大于0xFF的將被轉(zhuǎn)移為%uxxxx,能夠使用unescape函數(shù)解碼escape函數(shù)編碼的字符串。escape已被ecma標(biāo)準(zhǔn)拋棄。如今一般推薦使用encodeURI或encodeURIComponent函數(shù)取代。
? ? ? ?escape實(shí)例: escape(“中文”)的結(jié)果是"%u4E2D%u6587",escape("abc def")的結(jié)果是"abc%20def",空格編碼為0x20。
不管網(wǎng)頁編碼是什么,經(jīng)過JS的escape操作后,都會(huì)變成unicode碼。如第3節(jié)提到的,因?yàn)楸韱翁峤粫r(shí)參數(shù)中的空格會(huì)被編碼為+,所以escape函數(shù)不正確"+"進(jìn)行編碼,所以escape("abc+def")結(jié)果還是"abc+def"。
? ? ? ?第二個(gè)函數(shù)是encodeURI,它也是全局函數(shù)。encodeURI的目的是採用UTF-8給URI進(jìn)行編碼。
ASCII的字母、數(shù)字不編碼。- _ . ! ~ * ' ( )也不編碼,URI中具有特殊意義的字符也不編碼(如; / ? : @ & = + $ , #等)。
參數(shù)中的其它字符將轉(zhuǎn)換成UTF-8編碼方式的字符。并使用十六進(jìn)制轉(zhuǎn)義序列(%xx)生成替換。
相應(yīng)的解碼函數(shù)是decodeURI。
? ? ? ?encodeURI實(shí)例:encodeURI("測(cè)試 http://www.baidu.com/test?v=ab cd+@#")結(jié)果為"%E6%B5%8B%E8%AF%95%20http://www.baidu.com/test?
v=ab%20cd+@#"。
? ? ? ?第三個(gè)函數(shù)是encodeURIComponent,與encodeURI不同的是,它會(huì)對(duì)特殊符號(hào)如"; / ?
: @ & = + $ , #"進(jìn)行編碼。解碼函數(shù)是decodeURIComponent。
? ? ? ?encodeURIComponent實(shí)例:encodeURIComponent("測(cè)試 http://www.baidu.com/test?v=ab cd+@#")結(jié)果為%E6%B5%8B%E8%AF%95%20http%3A%2F%2Fwww.baidu.com%2Ftest%3Fv%3Dab%20cd%40%23%2B。
6 參考資料
- 關(guān)于URL編碼
- URL wiki
- Javascript教程
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
- 上一篇: POJ 1144 Network(无向图
- 下一篇: Laravel API记录