要求オブジェクトがUrlEncodedをデコードしていません
-
10-07-2019 - |
質問
C#、ASP.NET 3.5
エンコードされたクエリ文字列で単純なURLを作成します:
string url = "http://localhost/test.aspx?a=" +
Microsoft.JScript.GlobalObject.escape("áíóú");
これはうまくなります: http://localhost/test.aspx? a =%E1%ED%F3%FA (それは良い)
test.aspxをデバッグすると、奇妙なデコードが発生します:
string badDecode = Request.QueryString["a"]; //bad
string goodDecode = Request.Url.ToString(); //good
QueryStringが値をデコードしないのはなぜですか?
解決
代わりに HttpServerUtility.UrlEncode を使用してみてください。
Microsoft.JScript.GlobalObjectのMicrosoftドキュメント。 escape は、コード内から直接使用することを意図していないことを示しています。
編集:
コメントで述べたように、2つのメソッドは別々にエンコードし、Request.QueryStringは内部的にHttpUtility.UrlDecodeを使用するため、HttpServerUtility.UrlEncodeが使用するエンコードを想定しています。
(HttpServerUtility.UrlEncodeは実際に内部でHttpUtility.UrlEncodeを使用します。)
2つの方法の違いを簡単に確認できます。
新しいASP.NET Webアプリケーションを作成し、Microsoft.JScriptへの参照を追加してから、次のコードを追加します。
protected void Page_Load(object sender, EventArgs e)
{
var msEncode = Microsoft.JScript.GlobalObject.escape("áíóú");
var httpEncode = Server.UrlEncode("áíóú");
if (Request.QueryString["a"] == null)
{
var url = "/default.aspx?a=" + msEncode + "&b=" + httpEncode;
Response.Redirect(url);
}
else
{
Response.Write(msEncode + "<br />");
Response.Write(httpEncode + "<br /><br />");
Response.Write(Request.QueryString["a"] + "<br />");
Response.Write(Request.QueryString["b"]);
}
}
結果は次のようになります。
%E1%ED%F3%FA
%c3%a1%c3%ad%c3%b3%c3%ba
����
áíóú
所属していません StackOverflow