浏览器的url经过编码后发送到服务器。连接字符串的编码根据浏览器的不同编码的方式也不同。可经过测试,chrom ff ie等 参数部分的编码默认都是gb2312方式的 不同的是浏览器中地址栏中显示的不同。ie地址栏中显示的是未编码的url,点击回车编码后发送到浏览器。chrom 地址栏中是编码后url,如果在chrom的地址栏中的参数部分手写中文 点击回车 则参数部分以utf-8编码发送。
在服务器端进行参数解码 不知道到底是gb2312还是utf-8 所以解码的时候要做个判断
/// <summary>
/// 对url的连接字符串中的参数进行解码输出
/// </summary>
/// <param name="pname">参数名</param>
/// <param name="dvalue">参数默认值</param>
/// <returns>解码后的值</returns>
protected string GetQueryString(string pname, string dvalue)
{
//1 得到url传来的未解码的参数的值
string url = Request.RawUrl;
string paramenvalue = "";
string url1 = url.Substring(url.IndexOf('?') + 1);
if (url1.IndexOf(pname) > 0)
{
if (url1.IndexOf('&') > 0)
{
string[] parray = url1.Split('&');
if (parray.Length > 0)
{
for (int i = 0; i < parray.Length; i++)
{
string[] paramarray = parray[i].Split('=');
if (paramarray[0] == pname)
{
paramenvalue = paramarray[1];
}
}
}
}
else
{
paramenvalue = url1.Substring(url1.IndexOf('=') + 1);
}
//2 进行解码
//paramvalue是UrlEncode编码字符串
Encoding gb2312 = Encoding.GetEncoding("gb2312");
Encoding utf8 = Encoding.UTF8;
//首先用utf-8进行解码
string enparam = HttpUtility.UrlDecode(paramenvalue, utf8);
//Response.Write("用utf8解码后:" + classname);
// 将已经解码的字符再次进行编码.
string encode = HttpUtility.UrlEncode(enparam, utf8).ToUpper();
//Response.Write("用utf8编码后" + encode);
//与原来编码进行对比,如果不一致说明解码未正确,用gb2312进行解码
if (paramenvalue != encode)
{
//enparam = HttpUtility.UrlDecode(urlparam, gb2312);
enparam = Request.QueryString[pname];
}
return enparam;
}
else
{
return dvalue;
}
}