您的位置:首页 > 理论基础 > 计算机网络

关于asp.net HttpUtility.UrlDecode解码问题

2012-10-18 15:08 381 查看
最近做一个支付接口,对方回调时用的gb2312编码
asp.net默认request获取参数时是utf-8编码
这样我在取值的时候在page_load 事件或者preint事件里设置Request.ContentEncoding = Encoding.GetEncoding("gb2312")均无效
测试案例:建立一个asp.net web应用程序,拖一个button,一个textbox控件
Page_Load事件代码:

protected void Page_Load(object sender, EventArgs e)
{
Response.ContentEncoding = Encoding.GetEncoding("gb2312");
//Request.ContentEncoding = Encoding.GetEncoding("gb2312");//设置是无效的
}


这样每次响应我们都是用的gb2312,按照asp.net默认requset对象初始化时编码为utf-8,我们在文本框输入中文,再点button按钮时,request编码为utf-8,response编码为gb2312,所以造成文本框数据回发的时候变成了乱码(文本框中文部分显示一串问号)

网上千篇一律给出的办法是修改配置文件 <globalization requestEncoding= "gb2312 " />,这个是全局的,不推荐。我们需要的是修改某个页面的请求响应编码,而不影响到其他页面

现给出解决办法一:重写InitializeCulture方法即可,加入Request.ContentEncoding 的设置

protected override void InitializeCulture()
{
base.InitializeCulture();
Request.ContentEncoding = Encoding.GetEncoding("gb2312");
}


解决办法二:获取表单数据字符串,自己解析

Encoding encoding = Encoding.GetEncoding("gb2312");//自选解码方式
Stream resStream = Request.InputStream;//接收的表单都是放这里的
byte[] content = new byte[resStream.Length];
resStream.Read(content, 0, content.Length);
string postQuery = encoding.GetString(content);
//NameValueCollection resDic = HttpUtility.ParseQueryString(postQuery, encoding);//解决编码方式问题,默认还是会自动解码


下面给出简单的解析方法:

/// <summary>
/// 解析查询字符串
/// </summary>
/// <param name="postQuery"></param>
/// <returns></returns>
private NameValueCollection GetFormParams(string postQuery)
{
NameValueCollection result = new NameValueCollection();
string[] nameValueList = postQuery.Split('&');
foreach (string item in nameValueList)
{
if (item.Contains('='))
{
string[] nameValue = item.Split('=');
result.Add(nameValue[0], nameValue[1]);
}
}
return result;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: