Wednesday, July 16, 2008 - 文章

【茶包射手專欄】QueryString的中文編碼問題

同事在測試程式時,為求簡便,在IE地址列直接輸入測試用的參數,例如: MyApp.aspx?q=中文 (註: 此為不良示範,QueryString中如要指定英文字母及數字以外的字元,均應使用UrlEncode以求保險),結果ASPX中Request["q"]會抓到亂碼。

利用Visual Studio Debug時監看Request物件,會發現QueryString的原始Byte Array內容中,中文字是以BIG5方式編碼方式傳送的(有興趣研究的人可以試著用中文編碼解析工具驗證),而Request Encoding預設是UTF-8,最後當然是亂碼收場,並不意外。測試發現,如果把Request Encoding設成big5,Request["q"]便可抓到正確的值,但會破壞網站原本來往均應為UTF-8的設計,並不合理。因此,避免在URL中直接指定非ASCII文字,必要時使用URLEncode編碼過才是根本解決之道。

不過,在追查過程中,引發了另一個有趣的問題: IE的選項中有個"Send UTF-8 URLs",難道這個設定不能解決這個問題? 由於預設IE7的Send URL-8 URLs就是開啟的,顯然證實了該選項無法解決QueryString中直接夾帶中文的問題!

利用IE瀏覽"http: //someServer/中文.aspx?q=中文"並開啟Microsoft Network Monitor 3.1,分別觀察開啟或關閉"Send UTF-8 URLs"後所發出的HTTP Request封包。

結論是,"Send UTF-8 URLs"選項只會影響IE7送出Request中網頁檔案名稱的UrlEncode編碼(橘色框),至於QueryString中的中文字,則一律使用Windows預設的non-Unicode編碼(在正體中文環境中,多半就是BIG5)轉成Byte Array(綠色框)。所以,為了避免自找麻煩,在傳遞QueryString參數時,請多利用UrlEncode(Javascript中可用escape()函數)。

 【延伸閱讀】

搜尋

Go

<July 2008>
SunMonTueWedThuFriSat
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789
 
RSS
【工商服務】
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


BlogLook Score and Rank

Syndication