作者ithinkurdumb (Let's Go YANKEES!)
看板C_Sharp
标题[心得] ASP.NET Unicode QueryString Parameter
时间Fri Oct 21 18:28:49 2005
最近写的一个网站利用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