アラートについては、自分でエンコードを行っています。を削除すると、サーバー側と同じように見えるかもしれません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=B
。find.aspx?city=A&name=B
ただし、ブラウザーは寛大で、誤って HTML エンコードされた文字列を受け入れます。
最後に、ブラウザにはありません。<a>
タグ内であっても、リンクにスペースを入力すると、スペース (または他の文字) がエスケープされます。同様に、最近ではアドレス バーに奇妙な文字 (é、ï など) が表示されますが、HTTP 経由で送信すると、ブラウザーが正しくエンコードを行います。
更新:「決定的な」参照または証拠が必要であるというあなたの質問への回答について。
インターネット上で見つけることができませんでしたが、Reflector を使用して自分で探すことにしました。たとえば、 を設定するメソッドを調べると、すぐにを呼び出すHttpRequest.QueryString
プライベート メソッドに遭遇します。そのメソッドの終わり近くで、値に対して呼び出されます。結論: 二重デコードを防ぐために、自分で呼び出さないでください。HttpRequest.FillInQueryStringCollection
HttpValueCollection.FillfromEncodedBytes
HttpUtility.UrlDecode
これは、 Reflectorをダウンロードして System.Web の .NET ライブラリを逆アセンブルすると、自分で確認できます。