18

Web サービスのクエリ文字列とパラメータを IE10 のアドレス バーに入力して、サービスの結果を取得できるようにしたいという顧客からのリクエストを受け取りました。パラメータには、次のようなヘブライ語の文字列が含まれます。

http://mywebsite.com/service.asmx/foo?param1=123&param2=מחרוזתבעברית

そのIE10はクエリ文字列パラメーターをエンコードしないようです-?の後に続くすべての非ASCII文字。マークは '3f' バイトに変換されますが、? の前にあるものはエンコードされます。マーク - URL 自体。

たとえば、URLにアクセスしようとすると(パラメータは架空のもので、URLはそうではなく、サイトとは関係ありません)

http://www.shlomo.co.il/pageshe/sales/רכב-למכירה.asp?param=פאראם 

サーバーに送信したバイトをwiresharkで調べてください。

Wireshark 出力

URL のヘブライ語部分が urlencoded 文字列に置き換えられますが、ヘブライ語パラメーターが「3f」である ????? に置き換えられていることがわかります。

クロムの同じ文字列は、全体がエンコードされます。

GET http://www.shlomo.co.il/pageshe/sales/%D7%A8%D7%9B%D7%91-%D7%9C%D7%9E%D7%9B%D7%99%D7%A8%D7%94.asp?param=%D7%A4%D7%90%D7%A8%D7%90%D7%9D HTTP/1.1

win7/IE10 と winXPheb/IE8 のマシンで試してみました。

私のIE設定は次のとおりです(特に「エンコードされたアドレスを常に表示するオプション」をチェックして、それが役立つかどうかを確認して再起動しましたが、違いはありませんでした):

ここに画像の説明を入力

この問題に関する情報を探してみましたが、ほとんど見つかりませんでした。

私の質問は次のとおりです。

  • それは本当にこのようなものですか、それとも何か不足していますか?
  • この動作はどこかに文書化されていますか?
  • パラメーターのエンコードを有効にする IE/Win の設定はありますか。

ps確かに、クライアント/Web UIを開発している場合は、クエリを単純にurlencodeしますが、顧客からの要求は、クエリをIEアドレスバーに貼り付けることでした。そのため、この特定の動作に興味があります.

ありがとう。

4

3 に答える 3

19

はい、あなたの行動観察は正確です。Internet Explorer 10 以下は、URL をエンコードするための複雑なアルゴリズムに従います。これは Internet Explorer 11 で更新されたと言われていますが、新しいオプションが機能していないようです

「エンコードされたアドレスを常に表示するオプション」は、IDN ホスト名に対して PunyCode が表示されるかどうかに関係し、クエリ文字列には影響しません。Send UTF-8 URLs主にパスのエンコーディングに適用されますが、他のコードパスにも影響を与える可能性があります

動作はどこにも完全に文書化されていません。IEInternals ブログに完全な記事を書くつもりでしたが、そうする前に Microsoft から移動することになりました。このブログ投稿に部分的な説明があります。

はい、動作に影響を与える設定があります。[ツール] > [インターネット オプション] > [詳細設定] 内のSend UTF-8 URLsチェックボックスは、URL の送信方法を決定する変数の 1 つですが、このオプションはそれが意味することをやみくもに実行するわけではありません (クエリ文字列ではなく、パスのみを UTF-8 でエンコードします)。関連するその他の変数は次のとおりです。

  1. URL が入力された場所 (アドレス バーと [スタート] > [ファイル名を指定して実行] など)
  2. システムの ANSI コードページ (例: OS がデフォルトで使用するロケール)
  3. ブラウザに現在読み込まれているページの文字セット

これらの変数の結果として、適切にエンコードされていない URL (% エスケープされた UTF8 など) を Internet Explorer で確実に使用することはできません。

于 2013-08-13T22:13:43.923 に答える
3

クライアントが JavaScript から Web サービスを呼び出している場合は、 encodeuricomponent使用できます。あなたの場合encodeuricomponent("מחרוזתבעברית");

http://www.w3schools.com/jsref/jsref_encodeURIComponent.asp

于 2015-09-03T09:53:45.707 に答える