【茶包射手專欄】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()函數)。

 【延伸閱讀】

歡迎推文分享:
Published 16 July 2008 04:31 AM 由 Jeffrey
Views: 29,897



意見

# 三腳貓 said on 28 December, 2009 01:51 AM

請教Jeffrey大

我有一隻.asp要Response.Redirect到一隻.aspx

ASP的環境是Win2000 server,ASP.NET的環境是Win2003 + .NET2.0&3.5

ASP這樣寫:

Response.Redirect "10.16.9.148/vuLog.aspx & Server.URLEncode(rno)

測試case的rno值是「C  0981107178」(中間兩個全型空白)

但接收的ASPX無法正確運作

Response.Write(Server.HtmlEncode(Request.QueryString["rno"]));

Response.Write("<br />");

Response.Write(Server.HtmlEncode(Request.Url.Query));

在ASPX中用上3行看到的東西如下:

C�@�@0981107178

?rno=C%A1%40%A1%400981107178

用大大您的中文編碼解析工具看上述rno值

UrlEnc(Big5):C%a1%40%a1%400981107178

UrlEnc(UTF8):C%e3%80%80%e3%80%800981107178

是這個原因嗎?

ASP那邊用big5做urlencoding,ASP.NET可能不是用big5來decoding,是這樣嗎?

請問可有解法?

不知您可有空指導一下,非常感激。

# Jeffrey said on 28 December, 2009 10:07 PM

to 三腳貓, ASP.NET端有可能改成BIG5解碼,不過Unicode是趨勢,所以我會選擇把ASP端改成UTF-8編碼,例如:

<%@CodePage = 65001%>

<% Response.Write Server.UrlEncode("中文") %>

(記得ASP檔案要存成UTF-8編碼)

# 三腳貓 said on 28 December, 2009 11:49 PM

Jeffrey大

感謝您

我會試試

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<July 2008>
SunMonTueWedThuFriSat
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789
 
RSS
創用 CC 授權條款
【廣告】
twMVC
最新回應

Tags 分類檢視
關於作者

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

文章典藏
其他功能

這個部落格


Syndication