同事在測試程式時,為求簡便,在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()函數)。

 【延伸閱讀】


Comments

# by 三腳貓

請教Jeffrey大 我有一隻.asp要Response.Redirect到一隻.aspx ASP的環境是Win2000 server,ASP.NET的環境是Win2003 + .NET2.0&3.5 ASP這樣寫: Response.Redirect "http://10.16.9.148/vuLog.aspx?rno=" & 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,是這樣嗎? 請問可有解法? 不知您可有空指導一下,非常感激。

# by Jeffrey

to 三腳貓, ASP.NET端有可能改成BIG5解碼,不過Unicode是趨勢,所以我會選擇把ASP端改成UTF-8編碼,例如: <%@CodePage = 65001%> <% Response.Write Server.UrlEncode("中文") %> (記得ASP檔案要存成UTF-8編碼)

# by 三腳貓

Jeffrey大 感謝您 我會試試

Post a comment