2

いくつかのJavaScriptでは、私は持っています:

var url = "find.aspx?" + "location=" + encodeURIComponent( address );
alert( url );
location.href = url;

ここで、addressの値は文字列「Seattle、WA」です。

アラートで私は見る

find.aspx?Seattle%2C%20WA

私が期待するように。

しかし、サーバー側では、Request.Urlを見ると、関連するサブストリングは次のようになっています。

find.aspx?Seattle, WA

そしてFirefoxのURLウィンドウに表示されます

find.aspx?location=Seattle%2C WA

したがって、3つの異なる表現を取得していますが、3つの場所すべてで、アラートに表示される内容を確認する必要があります。私の期待では、location.hrefに割り当てたURLは、ブラウザーのURLウィンドウにそのまま表示され、Request.Urlでサーバーにそのまま渡される必要があります(サーバー上の値をデコードする必要があります)。それらを使用する前に)。何が起こっていますか?

4

3 に答える 3

2

Firefox は、ユーザーにとって使いやすい方法として、特定のエンコードされた文字をリテラル形式に変換します。また、アドレス バーに入力されたスペースをサーバーの %20 に変換ます。

更新: Firefox がエンコードされていないコンマを表示しない理由は、URL でコンマは許可されていますが、スペースは許可されていないためです。したがって、スペースは明確に解釈されることを認識していますが、事前にエンコードされたコンマは非エンコードのコンマとは異なります。一部のサーバーへのエンコードされたコンマ。参照: URL にコンマを使用できますか?

ASP はおそらく、文字列を自動的にエンコード解除することで、あなたを助けようとしています。

更新:ここで説明されているように、ASP.NET はデフォルトで Request.Url をアンエンコードしているようです: QueryString malformed after URLDecodeHttpRequest.Url.Query彼らはまた、デコードされていないバージョンにアクセスするために使用できることにも言及しています。

アラートは、「魔法」を行わない唯一のものです。

于 2010-01-22T07:52:32.600 に答える
1

アラートについては、自分でエンコードを行っています。を削除すると、サーバー側と同じように見えるかもしれませんencodeURIComponent

サーバー側では、ASP.NET は常にエンコードされていないフォームを表示します。これは、エンコード (解除) する必要のあるテキストを含むファイルに直接マップしやすくするためです。

URL エンコーディングの UTF8 表現のすべての文字を置き換えることができることに注意してください。同じURLになります。つまり、ブラウザ ウィンドウに次のように入力すると、引き続き機能します%66%59%6E%64.aspx?location=Seattle%2C%20WA。自分でリンクを作成する場合は、必要な文字のみをエンコードするには、サーバー側でUrlEncodeを使用します。

URL エンコーディングは、かなり扱いにくいものになる可能性があります。あなたはそれを説明するように頼みます。特定の文字の正しいエスケープを知るには、その文字が UTF8 でどのように見えるかを知る必要があります。UTF-8 バイトの 16 進値は、文字の %XX%YY 値になります。1 つの %XX の場合もありますが、合計で最大 6 つのバイト シーケンスにすることができます (たとえば、いくつかの漢字)。

URL エンコーディングは一方向のみに機能します。二重エンコードまたは二重アンエンコードは絶対に行わないでください。これは仕様上禁止されています。また、任意の文字をエンコードできるため、(ご存知のように)ラウンドトリップのエンコード/エンコード解除を常に実行できるとは限りません。エンコードを解除して再度エンコードすると、結果の文字列が異なる可能性がありますが、構文的には同じです。

HTML では、URLエンコーディングが HTML エンコーディングに散在することがあります。つまり、アンパサンドは HTML では有効ですが、HTML では有効ではありません。と HTML URL になりますfind.aspx?city=A&name=Bfind.aspx?city=A&name=Bただし、ブラウザーは寛大で、誤って HTML エンコードされた文字列を受け入れます。

最後に、ブラウザにはありません。<a>タグ内であっても、リンクにスペースを入力すると、スペース (または他の文字) がエスケープされます。同様に、最近ではアドレス バーに奇妙な文字 (é、ï など) が表示されますが、HTTP 経由で送信すると、ブラウザーが正しくエンコードを行います。


更新:「決定的な」参照または証拠が必要であるというあなたの質問への回答について。

インターネット上で見つけることができませんでしたが、Reflector を使用して自分で探すことにしました。たとえば、 を設定するメソッドを調べると、すぐにを呼び出すHttpRequest.QueryStringプライベート メソッドに遭遇します。そのメソッドの終わり近くで、値に対して呼び出されます。結論: 二重デコードを防ぐために、自分で呼び出さないでください。HttpRequest.FillInQueryStringCollectionHttpValueCollection.FillfromEncodedBytesHttpUtility.UrlDecode

これは、 Reflectorをダウンロードして System.Web の .NET ライブラリを逆アセンブルすると、自分で確認できます。

于 2010-01-22T08:08:04.130 に答える
0

あなたの例では、この行を変更できます

var url = "find.aspx?" + "location=" + encodeURIComponent( address );

var url = "find.aspx?" + "location=" + address;

アドレスをそのまま表示します。アドレス変数に「&」文字が含まれている場合、変数は破損します。したがって、encodeURIComponent を使用してこれらの URL をエンコードしています。

サーバー側では、これらのエンコードされたすべての文字列がデコードされます。これは、encodeURIComponent がアドレス変数 (& 文字が含まれているかどうかに関係なく) をサーバー側に正しく送信するためだけのものであることを意味します。

于 2010-01-22T07:57:43.780 に答える