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>