firefox chrme 瀏覽器地址欄URL參數漢字BUG問題排查總結

轉載地址:http://axdhxyzx.blog.163.com/blog/static/5894227820129251361422/

我在開發網頁時,一個分類條件用漢字做URL參數,然後在頁面加載時進行判斷來查詢對應數據並呈現數據列表。
正常情況下,這個分類條件是用戶在頁面上點擊鏈接獲得,可是我自己測試時,無意中在瀏覽器地址欄中輸入了這個參數值,結果噩夢就來了,而且持續兩天!!!
先介紹一下問題產生的環境:瀏覽器怎麼開發的,我沒做過,手裏有一個ie9和一個金山的獵豹瀏覽器(雙核,一個極速內核疑是谷歌內核,一個是兼容內核疑是ie6內核),操作系統用的是簡體中文版,默認字符編碼應該是ANSI(不知道它跟Unicode什麼關係),因爲在記事本另存爲時,默認的編碼格式就是這個,我開發的網頁從Web.Config到頁面文件所有的編碼格式和字符集都是採用UTF-8,ie9和獵豹瀏覽器編碼格式未做特殊設置,就是安裝時的默認設置,而火狐瀏覽器的編碼格式設置爲UTF-8,自動檢測處於關閉狀態。
問題是:在我網頁上如何點擊鏈接,後臺都能接收到正確的參數值(如風景背景),而在火狐瀏覽器上點擊鏈接,也同樣沒問題,而且我爲了編碼上不出錯,在拼URL字符串時都先編碼,然後在後臺接收參數時再解碼。那麼問題如何產生呢?當我直接在地址欄裏輸入地址,其中的參數直接用輸入法輸入漢字時,響應的頁面上就出現了亂碼,也就是說編碼解碼用的不是一個編碼格式了。
接下來查找問題原因和測試:
首先,我在輸出鏈接時已經轉碼了,爲什麼還是顯示漢字?
回答,其實這是一個假象,當你整體複製地址欄中的鏈接到記事本上時,會發現文本信息已經被轉碼,也就是說,我的字符串是轉成UTF8編碼格式的漢字,地址欄中的字符串也是UTF8格式,而瀏覽器本身具有解碼功能,它自動將UTF8編碼解碼成漢字,一句話,形式是漢字,實質是UTF8編碼當我後臺接收URL 參數時,也會將UTF8編碼格式的字符串解碼成漢字存儲在字符串變量中。
其次,我在地址欄中輸入漢字,火狐到底“幫“我做了什麼?
回答,當你輸入漢字時,火狐自動將其轉碼成GB2312編碼格式,這個爲什麼要轉這個編碼格式,目前還不清楚,懷疑是火狐調用了系統默認的編碼格式。這個編碼格式是怎麼來的不清楚,但是這個編碼是GB2312編碼格式是確認無疑的。
隨後,正式問題到來,爲什麼我在地址欄輸入漢字就亂碼了呢?
因爲當在地址欄中輸入漢字時,火狐瀏覽器自動將漢字轉碼爲GB2312編碼格式,請求到了服務器後,後臺文件Web.Config中的requestEncoding的編碼格式設置爲UTF-8,這樣在解碼時就出了問題,編碼和解碼不是一套編碼格式,出來的就是亂碼,經過測試,將文件Web.Config中的requestEncoding的編碼格式改爲gb2312,頁面就正常了,但是這是問題又來了,本身就是爲了不產生亂碼而使整個網站統一採用了UTF-8編碼,所以當其他正常操作時,頁面又亂碼了,而且也不能只爲這一種情況而更改設置,試想若有人用的火狐在對地址欄輸入漢字編碼爲其他格式呢?那麼只用gb2312是解決不了那麼多未知情況。而且後臺在接收字符串時進行解碼只能用一套編碼格式,如何應對那麼多的不同編碼格式呢?就算是可以後臺進行判斷,但是漢字本身就不被計算機識別,勢必要轉成對應的編碼,所以不管是哪種編碼,對計算機都是正確的,何以判斷?!只有當解碼後的字符顯示出來以後,人類才能分辨是否是漢字。
最後,沒有問題了,也沒有解決問題。因爲URL參數本身就不是讓用戶自己手動在地址欄中輸入的,地址欄只是讓用戶在進入網站入口(即網站首頁時輸入域名)用的,其餘的走向都應該通過頁面鏈接實現。同時地址欄中的字符串應該是不存在漢字的,值存在計算機能識別的最基本的字符纔對,這個過程我們網頁一般都會進行處理,可是現在的瀏覽器越來越智能,它會將看不懂的編碼直接給你解碼成對應的字符供用戶觀看。可是筆者還有一個疑問,同樣的操作爲什麼ie9瀏覽器不出問題,難道說它是操作系統的親戚,就能自動識別編碼了?爲什麼獵豹瀏覽器不出問題,難道說它是中國瀏覽器廠商開發的,就能自動識別中文編碼了嗎?都說火狐好,它的安全性確實好,除了安全特性,它還給開發者帶來哪些好處了呢?我一點都看不到,而且做一個破網頁,IE測完谷歌測,谷歌測完火狐測,即使是對火狐專門做的網頁,難道你就要求你的用戶只用火狐瀏覽器嗎?想當初大秦帝國的秦始皇統一文字、統一度量衡、統一。。。,今天已經沒有那麼強大的中國領袖了,連個最起碼的中文文字的編碼格式都不能統一,還七零八落的,真是無語了。。。
好了,噴完了,其實我知道,不是火狐的錯,而是我對計算機知識掌握得還不夠多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章