2010-07-05 4 views
0

У меня есть строка запроса со значением параметра, которая содержит норвежский символ å, закодированный как %e5. Страница содержит форму с атрибутом действия, который автоматически заполняется ASP.Net. Когда URL-адрес выводится в указанный атрибут, он печатается с полным двухбайтовым кодированием: %u00e5.Сломанная кодировка после обратной передачи

При отправке назад это выглядит нормально при отладке кода позади. Однако страница на самом деле делает редирект на себя (по какой-то другой причине) и заголовок переадресации расположения выглядит следующим образом: Location: /myFolder/MyPage.aspx?Param1=%C3%A5

Так %e5 переведен на %C3%A5, нарушающий выход как-то.

В тексте HTML сломанные символы выглядят как Ã¥ после вывода через HttpUtility.HtmlEncode.

Все веб-приложение кодируется ISO8859-1.

PS. При удалении u00 с выхода %u00e5 в атрибуте действия перед отправкой формы все выводится красиво. Но ошибка, по-видимому, представляет собой перевод с %e5 на %C3%A5. (И, конечно, саморегуляция, но это другое дело.)

Любые указатели?

+1

Это не ошибка , '% C3% A5' - это просто версия UTF-8 с URL-кодировкой. Ошибка заключается в преобразовании в HTML: каждая кодированная последовательность UTF-8 в URL-адресе должна быть преобразована обратно в кодовую точку Юникода, а затем в HTML-кодировку. – Philipp

+0

На самом деле кажется, что URL-кодировка верна, если она '% e5' для' å' согласно http://www.w3schools.com/tags/ref_urlencode.asp. Похоже, проблема заключается в том, что перенаправление IIS выводит заголовок 'location' с помощью кодировки utf-8, т. Е.'% E5' переводится в '% c3% a5' – Polymorphix

ответ

0

Решение, в результате которого я закончил, вручную кодировал URL-адрес перенаправления.

public void ReloadPage() 
{ 
    UrlBuilder url = new UrlBuilder(Context, Request.Path); 
    foreach (string queryParam in Request.QueryString.AllKeys) 
    { 
     string queryParamValue = Request.QueryString[queryParam]; 
     url.AddQueryItem(queryParam, queryParamValue); 
    } 
    Response.Redirect(url.ToString(), true); 
} 

url.AddQueryItem в основном делает HttpContext.Server.UrlDecode (queryParamValue) и url.ToString строит строку запроса и для каждого элемента запроса делает HttpContext.Server.UrlEncode (queryParamValue).

UrlBuilder класс уже присутствует в нашей библиотеке, поэтому, когда я нашел эту проблему и понял, что C# /. Net не предоставляют инструменты для этого, кодирования затруднительного быстро :)

Смежные вопросы