[心得] ASP.NET Unicode QueryString Parameter

看板C_Sharp (C#)作者 (Let's Go YANKEES!)時間20年前 (2005/10/21 16:22), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/2 (看更多)
最近寫的一個網站利用querystring parameter在兩個網頁中傳送資料, (像 Receive.aspx?query=XXX 這樣). querystring有可能是英文, 或是其他unicode, 中文, 日文等等. 今天碰到了一個問題. 因為我用的web server和client都是英文的Windows XP, default language for non-unicode app也都是設定成英文, querystring是unicode的時候都沒出過問題. 但是在測試的時候有個client是中文的Windows XP, (後來發現default language for non-unicode app設定成中文也會出問題) 就發現querystring會變成亂碼. 像是"Receive.aspx?query=查詢", 到了Receive.aspx中把querystring抓出來之後, "查詢"變成了"查?". 一開始以為是IE中有個Always send URLs as UTF-8的選項沒打勾, 但是發現都有打勾. 想了半天不得其解, 想到最直接的兩個方法, 一個就是不用querystring改用session, 另一個就是讓改變querystring的內容. (到現在還是搞不懂為什麼會出現這個問題, 還請高手賜教) 因為網頁本身的關係沒辦法用session, 所以就從改變querystring著手. 想到的改法是先抓出querystring的hex值, 傳輸完成之後再從hex值還原成原本的querystring. 這是送出querystring的部分 (Pass.aspx.cs): string strQuery = XXX; // XXX 是query的內容 string strQueryHex = null; // 儲存querystring的hex值 byte [] byteQuery = new byte[strQuery.length]; byteQuery = Encoding.UTF8.GetBytes(strQuery); // 把strQuery的內容轉成byte // codebehind最開始要加上using System.Text; for (int c = 0; c < byteQuery.Length; c++) { strQueryHex += String.Format("{0:x2}", byteQuery[c]); // 將byteQuery轉換成16進位存到strQueryHex中 } 這時候用 Receive.aspx?query=strQueryHex 來把querystring丟給Receive.aspx. 接收querystring的部分 (Receive.aspx.cs): string strQueryHex = Request.Params["query"]; string strQuery = null; byte [] byteQuery = new Byte[strQueryHex.Length / 2]; // Length / 2是因為strQueryHex中每2個char換成1個byte for (int c = 0; c < byteQuery.Length; c++) { byteQuery[c] = Convert.ToByte(strQueryHex.Substring(c * 2, 2),16 ); // 利用Substring來一次取出strQueryHex中的2個char // Convert時將base設定為16, Convert之後就會變成10進位 } strQuery = Encoding.UTF8.GetString(ByteQueryString); // 把byteQuery中的值存回strQuery中 // strQuery就是所要的querystring了 // 同樣要在codebehind開始的地方加上using System.Text; 如果有錯誤或是可以改進的地方, 請各位不吝指正, 謝謝 :) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.68.184.96
文章代碼(AID): #13MALVdc (C_Sharp)
文章代碼(AID): #13MALVdc (C_Sharp)