asp.net querystring文字化けの解決方法
3366 ワード
通常の状況では、asp.netのウェブサイトはUTF 8を直接使用してページコード化を行うことが多いです。これはJavascriptデフォルトウェブサイトのコードと同じですが、GB 2312を採用してGB 2312のウェブサイトに対して直接javascriptでajaxデータを提出する場合もあります。http://www.xxx.com/accept.aspx?name=張三さん、あるいはUTF 8のサイトで以下のasp.netのコードで提出してもだめです。
UTF 8符号化通信およびGB 2312ウェブサイト通信方式における符号化変換方式は、多くの実施形態がある。
第一は、まず伝送する文字に対してUrlEnccodeを行い、この符号化された文字は、復号時にUTF 8符号化方式で手作業で復号され、結果が一致することを保証し、対象ページに送信された場合であってもGB 2312は同じ結果となり、querystring符号化が回避される。復号方式は以下のコードです。
第二の種類は、クライアントから提出されたバイトデータを直接読み出して変換するという点で、Request.QueryString[name]は文字化けしています。MSは現在のページの符号化によって変換されています。例えば、現在のページコードはGB 2312です。一方、人が提出しているのはUTF 8です。人が提出していないUTF 8符号化はもちろん文字化けしています。人家から伝わったのではなく文字化けです。この時、元のデータを再復号して、querystringの文字化けを避ける必要があります。残念なことに、頭の元のバイトデータを直接提供する方法は見つけられませんでした。大丈夫です。MSのソースコードを解剖してみます。コードは次の通りです。
Query StrigBytes属性は、プロトタイプは以下のinternal byte[QueryStrigBytes]です。これが元のQueryStringバイトです。募集しました
いろいろなコードの変換は自分で全部できます。結局は提出されたバイトをもらいました。querystringの文字化け問題を解決するのに役立ちたいです。
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の文字化け問題を解決するのに役立ちたいです。