请求对象不解码UrlEncoded

时间:2009-09-17 16:43:09

标签: asp.net url unicode query-string decode

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不会对值进行解码?

1 个答案:

答案 0 :(得分:1)

您可以尝试使用HttpServerUtility.UrlEncode

Microsoft.JScript.GlobalObject.escape上的Microsoft文档指出,它不打算直接在您的代码中使用。

修改
正如我在评论中所说:两种方法编码方式不同,Request.QueryString需要HttpServerUtility.UrlEncode使用的编码,因为它内部使用HttpUtility.UrlDecode。

(HttpServerUtility.UrlEncode实际上在内部使用了HttpUtility.UrlEncode。)

您可以轻松看到两种方法之间的区别 创建一个新的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

����
áíóú