[心得] ASP.NET Unicode QueryString Parameter
看板C_Sharp (C#)作者ithinkurdumb (Let's Go YANKEES!)時間20年前 (2005/10/21 16:22)推噓0(0推 0噓 0→)留言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
討論串 (同標題文章)
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章