asp.net querystring文字化けの解決方法


通常の状況では、asp.netのウェブサイトはUTF 8を直接使用してページコード化を行うことが多いです。これはJavascriptデフォルトウェブサイトのコードと同じですが、GB 2312を採用してGB 2312のウェブサイトに対して直接javascriptでajaxデータを提出する場合もあります。http://www.xxx.com/accept.aspx?name=張三さん、あるいはUTF 8のサイトで以下のasp.netのコードで提出してもだめです。

WebRequest request = WebRequest.Create("http://www.xxx.com/accept.aspx?name= "); 
request.Method = "POST"; 
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
このようにGB 2312符号化のウェブサイトでRequest.QueryString[name]は文字化けしています。MSはコードをこのパッケージに変換しました。
UTF 8符号化通信およびGB 2312ウェブサイト通信方式における符号化変換方式は、多くの実施形態がある。
第一は、まず伝送する文字に対してUrlEnccodeを行い、この符号化された文字は、復号時にUTF 8符号化方式で手作業で復号され、結果が一致することを保証し、対象ページに送信された場合であってもGB 2312は同じ結果となり、querystring符号化が回避される。復号方式は以下のコードです。

HttpUtility.UrlDecode(s, Encoding.UTF8);
これは正確な張三を得ることができます。これは提出する時にまずHttpUtility.UrlEncodeをUTF 8に符号化して、それからname=(符号化された文字)にしてください。これも今のところよく使われている解決方法です。欠点の一つは他の人に先にどのようにUrlコードを教えてからどうすればいいですか?
第二の種類は、クライアントから提出されたバイトデータを直接読み出して変換するという点で、Request.QueryString[name]は文字化けしています。MSは現在のページの符号化によって変換されています。例えば、現在のページコードはGB 2312です。一方、人が提出しているのはUTF 8です。人が提出していないUTF 8符号化はもちろん文字化けしています。人家から伝わったのではなく文字化けです。この時、元のデータを再復号して、querystringの文字化けを避ける必要があります。残念なことに、頭の元のバイトデータを直接提供する方法は見つけられませんでした。大丈夫です。MSのソースコードを解剖してみます。コードは次の通りです。

public NameValueCollection QueryString { 
          get {  
              if (_queryString == null) { 
                  _queryString = new HttpValueCollection();  

                  if (_wr != null) 
                      FillInQueryStringCollection();  

                  _queryString.MakeReadOnly(); 
              } 

              if (_flags[needToValidateQueryString]) { 
                  _flags.Clear(needToValidateQueryString);  
                  ValidateNameValueCollection(_queryString, "Request.QueryString");  
              } 

              return _queryString; 
          } 
      } 

private void FillInQueryStringCollection() 

    byte[] queryStringBytes = this.QueryStringBytes; 
    if (queryStringBytes != null) 
    { 
        if (queryStringBytes.Length != 0) 
        { 
            this._queryString.FillFromEncodedBytes(queryStringBytes, this.QueryStringEncoding); 
        } 
    } 
    else if (!string.IsNullOrEmpty(this.QueryStringText)) 
    { 
        this._queryString.FillFromString(this.QueryStringText, true, this.QueryStringEncoding); 
    } 

ちなみに、Query Stringは初めて訪問された時に初期化されました。もしあなたのプログラムにそれが使われていなかったら、その対象はずっと空のままになります。MSは詳細を考慮しました。
Query StrigBytes属性は、プロトタイプは以下のinternal byte[QueryStrigBytes]です。これが元のQueryStringバイトです。募集しました

Type type = Request.GetType(); 
PropertyInfo property = type.GetProperty("QueryStringBytes", 
BindingFlags.Instance  | BindingFlags.IgnoreCase | BindingFlags.NonPublic); 
byte[] queryBytes = (byte[])property.GetValue(Request, null); 
string querystring = HttpUtility.UrlDecode(queryBytes, Encoding.UTF8); 
querystringは何ですか?ハハname=張三です。
いろいろなコードの変換は自分で全部できます。結局は提出されたバイトをもらいました。querystringの文字化け問題を解決するのに役立ちたいです。