asp.Netquery stringおよびform dataで発生した符号化問題

4764 ワード

この問題に直面したとき、頭の中でフラッシュした最初の解決策はwebを設定することです.configの符号化.しかし、あるページのニーズについて他の妥協を招くのは、良い解決策ではないと思います.そこでネット上で答えを検索して、下で少し分かち合って、残念なことに研究が深くなくて、query stringの問題だけを解決して、form dataの問題はwebを修正しました.config解決.
 
requestを使用します.QeryString.Get("")で得られたvalueは,url原生の値ではなく,トランスコード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がgb 2312符号化であれば問題が発生し、常に乱符号を取得する.
 
GET query stringの解決方法:
まずオリジナルのQueryを取得し、その後gb 2312で復号する
 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方式、既知のデータ値はgb 2312符号化(例えば、%D 4%C 1 UTEST 13=広東UTEST 13))
状況はquery stringと同じかもしれないformが得られた時はすでに符号化されていました
 
現在、このwebを修正する解決策は一つしか考えられていない.config:
1、webから来ました.config
1 <system.web>

2     <globalization requestEncoding="gb2312" responseEncoding="gb2312"  />

3 </system.web>