0

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が値をデコードしないのはなぜですか?

4

1 に答える 1

1

代わりにHttpServerUtility.UrlEncodeを使用してみてください。

Microsoft.JScript.GlobalObject.escapeに関するMicrosoftのドキュメントには、コード内から直接使用することを意図したものではないと記載されています。

編集:
コメントで述べたように:2つのメソッドはエンコードが異なり、Request.QueryStringは、内部でHttpUtility.UrlDecodeを使用するため、HttpServerUtility.UrlEncodeで使用されるエンコードを想定しています。

(HttpServerUtility.UrlEncodeは、実際にはHttpUtility.UrlEncodeを内部的に使用します。)

2つの方法の違いを簡単に確認できます。
新しいASP.NETWebアプリケーションを作成し、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

����
áíóú
于 2009-09-17T17:17:08.597 に答える