2009-09-17 3 views
0

C#, ASP.NET 3.5Запрос на объект не декодирования UrlEncoded

создать простой 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 

Почему Qu Qu eryString не расшифровывает значения?

+0

Что происходит, когда вы делаете строку badDecode = Request.QueryString [ "а"]. ToString() ;? ToString() - специфический для локали поток и иногда может делать магию. –

ответ

1

Вместо этого вы можете использовать HttpServerUtility.UrlEncode.

Документация Майкрософт по адресу Microsoft.JScript.GlobalObject.escape гласит, что она не предназначена для использования непосредственно из вашего кода.

Edit:
Как я уже говорил в комментариях: Два метода кодирования по-разному и 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 

���� 
áíóú 
+0

Проблема не в кодере, это связано с тем, что QueryString на получающей странице получает частичную тарабарщину. –

+0

Я пробовал как Microsoft.JScript.GlobalObject.escape, так и HttpServerUtility.UrlEncode, а первый дает тарабарщину, и последний работает нормально. –

+0

Методы кодируются по-разному. QueryString ожидает формат, используемый HttpServerUtility.UrlEncode. –