リクエストをJavaWebサービスに渡すASP.Net(2.0)HTTPハンドラーに送信するJavaScriptリクエストがあります。このシステムでは、アクセント付きの特殊文字などの特殊文字は正しく渡されません。
例えば
- 人間の入力:
Düsseldorf
- へのJavaScript非同期リクエストになり
http://site/serviceproxy.ashx?q=D%FCsseldorf
ます。これは、私が知る限り、ISO-8859-1およびUTF-8で有効です。(UTF-8で%c3%bcでない限り) HttpContext.Current.Request.QueryString.Get("q")
D�sseldorf
トラブルが始まるところから戻ります。- しかし、(a'?')を
HttpUtility.UrlEncode(HttpContext.Current.Request.QueryString.Get("q"), Encoding.GetEncoding("ISO-8859-1"))
返しますD%3fsseldorf
- と
HttpUtility.UrlEncode(HttpContext.Current.Request.QueryString.Get("q"), Encoding.UTF8)
戻りますD%ef%bfsseldorf
そのため、値が正しくデコードまたは再エンコードされて、Javaサービスに渡されません。
- 通知
HttpContext.Current.Request.Url.Query
は?q=D%FCsseldorf&output=json&from=1&to=10
HttpContext.Current.Request.QueryString.ToString()
ですがq=D%ufffdsseldorf&output=json&from=1&to=10
HttpContext
これはなぜですか。また、次のようなリクエストヘッダーを尊重するように指示するにはどうすればよいですか。
Content-Type=application/x-www-form-urlencoded;+charset=UTF-8
QueryString
UTF-8文字セットを使用してURLをデコードします。
補遺:答えが指摘しているように、問題はエンコードほどデコードにありません。JavaScriptでの使用escape()
は、UTF-8に従ってエスケープしませんが、使用はエスケープencodeURIComponent()
します。