URL全稱
Uniform Resource Locator,直譯為“統(tǒng)一資源定位符”,也就是網(wǎng)頁(yè)地址,是互聯(lián)網(wǎng)上任意角落都可以訪問到的,言外之意是說,URL不受國(guó)別、種族、語(yǔ)言、編碼差異的約束,是編碼無關(guān)的。然而我們常常在瀏覽器中敲入諸如“http://url/中文”的url,也能正確訪問,既然url中包含中文,那么如何讓其他國(guó)家那些沒有中文編碼的計(jì)算機(jī)上也能訪問到相同的網(wǎng)址呢?
RFC 1738中對(duì)URL有明確規(guī)定,URL必須由英文字母、數(shù)字、和某些標(biāo)點(diǎn)符號(hào)組成,不能使用其他文字,因此所有包含中文的URL都應(yīng)當(dāng)是非法的!其實(shí),瀏覽器自作聰明的為我們做了很多人性化的hack,比如,瀏覽器會(huì)對(duì)地址欄中填入的url進(jìn)行先編碼再使用,因此,不論怎樣,一個(gè)正確封裝的http包中的URI字段一定不會(huì)出現(xiàn)中文字符。也就是說,實(shí)際發(fā)生作用的url也一定如RFC 1738中所言,非ascII碼要先轉(zhuǎn)換成ascII碼序列,但RFC 1738沒有規(guī)定具體的編碼方法,而是交給應(yīng)用程序(瀏覽器)和web程序作者自己決定。這導(dǎo)致“URL編碼”成為了一個(gè)混亂的領(lǐng)域。也會(huì)導(dǎo)致一些奇怪的現(xiàn)象發(fā)生。
我們分別在firefox和ie用baidu和google搜索“淘寶”。
在firefox中百度“淘寶”,出現(xiàn):
實(shí)際發(fā)生請(qǐng)求的url為:
同地址欄中顯示是一致的,搜索結(jié)果也正確。在地址欄中直接輸入“http://www.baidu.com/s?wd=淘寶”也是如此,在firefox中g(shù)oogle“淘寶”:
實(shí)際發(fā)生請(qǐng)求的url為:
可以看到,實(shí)際發(fā)生請(qǐng)求的url和地址欄顯示的url不一致,搜索結(jié)果正確。這時(shí),重新請(qǐng)求地址欄的“url”(不是刷新),地址欄顯示為:
實(shí)際發(fā)生的請(qǐng)求為:
這時(shí),地址欄和實(shí)際發(fā)生的請(qǐng)求是一致的,搜索結(jié)果正確。進(jìn)一步分析之前,先看看js里的兩個(gè)運(yùn)算
我們知道escape()是計(jì)算unicode編碼,傳說中正統(tǒng)的URL編碼encodeURI()則是進(jìn)行utf-8編碼,(簡(jiǎn)單講,unicode編碼是純粹的編碼方式,utf-8是unicode編碼的一種實(shí)現(xiàn),即將二進(jìn)制unicode編碼再編碼,以一種比較節(jié)約空間的方式對(duì)unicode全集進(jìn)行二次編碼)。escape()的結(jié)果是將每個(gè)unicode字符以%u分割,encodeURI是每個(gè)字節(jié)以%分割,也就是說,“淘”和“寶”的unicode編碼分別是“6DD8”和“5B9D”,他們的utf-8編碼分別是“E6 B7 98”和“E5 AE 9D”,此外,他們的gbk編碼分別為“CC D4”和“B1 A6”。
初步得到結(jié)論一:在firefox中的百度搜索,通過form提交的中文轉(zhuǎn)換為gbk編碼,參與http包的封裝。在ff中g(shù)oogle搜索,通過form提交的中文轉(zhuǎn)換為utf-8編碼,但顯示在地址欄中的url是其中文映像(如果這時(shí)將地址欄復(fù)制下來,復(fù)制的實(shí)際是轉(zhuǎn)碼后的url,無法復(fù)制url中的中文字符)。如果直接在ff地址欄中輸入中文url,這時(shí),url里的中文字符一律進(jìn)行g(shù)bk編碼,不管百度還是google都是如此。
復(fù)制不了里面的中文
如此看來,firefox默認(rèn)處理url里的中文,都是通過gbk編碼進(jìn)行編碼的,這里和網(wǎng)頁(yè)編碼無關(guān)(瀏覽器無法檢測(cè)將要被訪問的網(wǎng)頁(yè)編碼)。
那么,百度和google對(duì)unicode編碼和utf-8編碼的支持情況如何呢?
“淘寶”的unicode編碼為“%6D%D8%5B%9D”,在ff中訪問“http://www.baidu.com/s?wd=%6D%D8%5B%9D”
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。