儘管有很多規範URL的標準,例如RFC 3987,但實際應用中卻非常混亂。本文主要介紹瀏覽器發送URL到服務器的一些特性,作爲開發和應用的參考。
通常瀏覽器會用兩種編碼方式發送URL到服務器,分別是UTF-8和ANSI(當前系統語言設置,在Windows系統中可以理解爲當前代碼頁)。接下來分別介紹幾種常用瀏覽器發送URL的編碼特性。
一、直接在地址欄輸入URL的情況
中文Windows環境下,假如直接在瀏覽器的地址欄輸入URL:
http://www.charset.cn/中國.html?kw=中國
- IE瀏覽器特性
PATH部分 參數部分 UTF-8模式(默認) %E4%B8%AD%E5%9B%BD.html kw=中國 UTF-8編碼、urlencode GBK編碼、無urlencode ANSI模式 中國.html kw=中國 GBK編碼、無urlencode GBK編碼、無urlencode 中文Windows環境下,IE中默認發送的URL的PATH部分是UTF-8編碼,參數部分是GBK編碼。IE的設置選項中有一項是“總是以 UTF-8 發送URL”可以改變發送URL的編碼爲ANSI。
- FireFox瀏覽器特性
PATH部分 參數部分 UTF-8模式 %E4%B8%AD%E5%9B%BD.html kw=%E4%B8%AD%E5%9B%BD UTF-8編碼、urlencode UTF-8編碼、urlencode ANSI模式(默認) %D6%D0%B9%FA.html kw=%D6%D0%B9%FA GBK編碼、urlencode GBK編碼、urlencode 中文Windows環境下FireFox中默認發送的URL的PATH和參數都是GBK編碼,在FireFox地址欄輸入“about:config”,找到選項“network.standard-url.encode-utf8”,即可改變發送URL的編碼方式。
- Opera瀏覽器特性
PATH部分 參數部分 UTF-8模式(默認) %E4%B8%AD%E5%9B%BD.html kw=%E4%B8%AD%E5%9B%BD UTF-8編碼、urlencode UTF-8編碼、urlencode
二、來自網頁中的鏈接
在不同的瀏覽器中打開不同編碼的網頁中的鏈接,特性也不相同。在不改變瀏覽器默認選項情況下訪問不同編碼的網頁中以下鏈接:
http://www.charset.cn/中國.html?kw=中國
- IE瀏覽器特性
PATH部分 參數部分 UTF-8網頁 %E4%B8%AD%E5%9B%BD.html kw=中國 UTF-8編碼、urlencode UTF-8編碼、無urlencode GBK網頁 %E4%B8%AD%E5%9B%BD.html kw=中國 UTF-8編碼、urlencode GBK編碼、無urlencode - FireFox瀏覽器特性
PATH部分 參數部分 UTF-8網頁 %E4%B8%AD%E5%9B%BD.html kw=%E4%B8%AD%E5%9B%BD UTF-8編碼、urlencode UTF-8編碼、urlencode GBK網頁 %D6%D0%B9%FA.html kw=%D6%D0%B9%FA GBK編碼、urlencode GBK編碼、urlencode
如果改變IE默認選項爲ANSI模式或者將FireFox改爲UTF-8模式的訪問結果可以自己測試。
幾點說明:
- 對於開發人員而言,一定要考慮到不同環境下URL編碼的不同,才能實現系統更好的兼容性。兼容性好的系統必須要能夠識別來自客戶端URL的編碼,才能正確處理。
例如在Opera瀏覽器地址欄直接輸入“http://www.baidu.com/s?wd=我們”,就會發現不能正確訪問。 - 不同的WEB服務器對各種編碼的URL處理也不相同,儘量不要使用中文字符作文件名。
- 如果寫入網頁中的鏈接包括中文字符,最好使用urlencode處理,才能和當前網頁編碼無關。否則有可能不能正確訪問。
- 很多情況下瀏覽器的地址欄看到URL並不等同於發送到服務器的URL。要正確查看瀏覽器發送的到服務器URL,最好藉助一些工具分析HTTP的請求頭。