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

当遇到此问题时,脑海里闪过的第一个解决方案是设置 web.config 的编码。但一想,就某一个页面的需求而致使其余跟着妥协,不是好的解决方案。因而网上搜索答案,下面作个小分享,遗憾的是研究不够深刻,只解决了query string 的问题,而 form data 问题用了修改 web.config 解决。
 
使用 request.QeryString.Get("") 得到的 value,已经不是 url 原生(raw)的值了,而是通过转码 UrlDecode 的值。
使用的编码方式:
一、来自 web.config
1 <system.web>
2     <globalization requestEncoding="gb2312" responseEncoding="gb2312" fileEncoding="utf-8" responseHeaderEncoding="utf-8" />
3 </system.web>
二、若是没有配置,则使用 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:
一、来自 web.config
1 <system.web>
2     <globalization requestEncoding="gb2312" responseEncoding="gb2312"  />
3 </system.web>
相关文章
相关标签/搜索