asp.net query string 及 form data 遇到的编码问题

当遇到此问题时,脑海里闪过的第一个解决方案是设置 web.config 的编码。但一想,就某一个页面的需求而导致其他跟着妥协,不是好的解决方案。于是网上搜索答案,下面做个小分享,遗憾的是研究不够深入,只解决了query string 的问题,而 form data 问题用了修改 web.config 解决。
 
使用 request.QeryString.Get("") 获得的 value,已经不是 url 原生(raw)的值了,而是经过转码 UrlDecode 的值。
使用的编码方式:
1、来自 web.config
1 <system.web>
2     <globalization requestEncoding="gb2312" responseEncoding="gb2312" fileEncoding="utf-8" responseHeaderEncoding="utf-8" />
3 </system.web>
2、如果没有配置,则使用 utf-8,一般情况是没问题的。但是如果 query string 是 gb2312 编码则会出现问题,永远获取的是乱码。
 
针对 GET query string 解决办法:
先获得原生的 Query,然后用 gb2312 解码
 1 var queryStrings = Request.Url == null
 2                 ? Request.QueryString
 3                 : HttpUtility.ParseQueryString(Request.Url.Query, Encoding.GetEncoding("GB2312"));
 4  
 5 var value = queryStrings[key];
 6  
 7 private string Decode(string value)
 8 {
 9       var utf8 = Encoding.UTF8;
10       var decode = HttpUtility.UrlDecode(value.ToUpper(), utf8);
11       var encode = (HttpUtility.UrlEncode(decode, utf8) ?? string.Empty).ToUpper();
12       var encoding = (value == encode) ? Encoding.UTF8 : Encoding.GetEncoding("GB2312");
13 
14         return HttpUtility.UrlDecode(value, encoding);
15 }
 
针对 POST form 的解决办法:
(x-www-form-urlencoded 方式,已知数据值有 gb2312 编码(如,%D4%C1UTEST13 = 粤UTEST13))
也许情况和 query string 一样,request.form 获得的时候是已经编码过了
 
目前只想到一种解决方法,修改该 web.config:
1、来自 web.config
1 <system.web>
2     <globalization requestEncoding="gb2312" responseEncoding="gb2312"  />
3 </system.web>

 

 
 
posted @ 2015-04-03 15:27  Leaf.Duan  阅读(285)  评论(0编辑  收藏  举报