Вопрос

С#, 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 по Microsoft.JScript.GlobalObject.escape заявляет, что он не предназначен для использования непосредственно из вашего кода.

Редактировать:
Как я сказал в комментариях:Эти два метода кодируют по-разному, и Request.QueryString ожидает кодировку, используемую HttpServerUtility.UrlEncode, поскольку внутри него используется HttpUtility.UrlDecode.

(HttpServerUtility.UrlEncode фактически использует HttpUtility.UrlEncode внутри себя.)

Вы можете легко увидеть разницу между двумя методами.
Создайте новое веб-приложение ASP.NET, добавьте ссылку на 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

����
áíóú
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top