5

リクエストを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

QueryStringUTF-8文字セットを使用してURLをデコードします。

補遺:答えが指摘しているように、問題はエンコードほどデコードにありません。JavaScriptでの使用escape()は、UTF-8に従ってエスケープしませんが、使用はエスケープencodeURIComponent()します。

4

2 に答える 2

6

あなたのサーバー (IIS?) で使用されているデフォルトの文字エンコーディングが何であるか、または変更できるかどうかはわかりませんが、役立つかもしれないことをいくつか教えてください.

0xFC は ü の ISO-8859-1 エンコーディングです。Unicode のコード ポイントは U+00FC ですが、UTF-8 でエンコードすると 2 バイト必要になり、0xC3 0xBC になります。

UTF-8 デコーダーが不正なバイト シーケンス 0xFC を検出した場合、それを Unicode の「置換文字」である U+FFFD としてデコードし、別の有効なバイト シーケンス (この場合は . '。

あなたが得る理由%3fはそれです '?' ラテン文字セットの「置換文字」であり、Unicode 文字セットの � に似ています。

クライアントは ISO-8859-1 でエンコードされていると思いますが、サーバーは UTF-8 でデコードしています。サーバーに到達するとすぐに、データが破損します。UTF-8 エンコーディングを使用するようにクライアントを変更することをお勧めします。要求しているはずですhttp://site/serviceproxy.ashx?q=D%C3%BCsseldorf

これらの URL を JavaScript から作成しているように思われるため、 ではなくencodeURIおよびencodeURIComponent関数を使用する必要がありますescape

于 2008-11-26T01:00:12.927 に答える
1

URL を IE8 に直接入力すると、ASP.NET 汎用ハンドラーで同じ問題が発生します。文字はchar 65533として送信されていますが、IE8を設定しています

[x] UTF-8 URL を送信します。

私のシナリオでは、Visual Studio で HTTP ハンドラーをデバッグし、ハンドラーのアドレスをブラウザーに直接入力しています。

http://localhost/myHandler.ashx?term=xxxxxx

次に、コードをステップ実行します。クライアントは UTF-8 でエンコードされた URL を渡しますが、開発マシンで実行されている IE8 がクライアントである場合にコードをデバッグする方法はありますか?

于 2010-01-21T19:59:39.160 に答える