Кодирование не-UTF-8 текста в параметрах в ASP.NET MVC - PullRequest
4 голосов
/ 22 декабря 2009

Фон

У меня есть веб-приложение, которое использует кодировку ISO-8859-1. Когда я передаю параметры, используя Html.ActionLink(), значение декодируется до UTF-8:

Web.config

<globalization requestEncoding="iso-8859-1" responseEncoding="iso-8859-1"
               fileEncoding="iso-8859-1" />

Index.aspx

This is a <%= Html.ActionLink("test", "Read", new { name="Cosméticos" }) %>

генерирует следующее:

This is a <a href="/Intranet/Read?name=Cosm%C3%A9ticos">test</a>

Проблема в том, что значение, которое я получаю в моем контроллере, равно UTF-8, а не iso-8859-1:

TestController

public ActionResult Read(string name) {
  //name is "Cosméticos" here!
}

Вопрос

Почему строка не декодируется до Cosméticos?

Ответы [ 4 ]

1 голос
/ 15 августа 2010
public static string ActionLinkNoEncode(this HtmlHelper htmlHelper, string linkText, ActionResult action )
{
    var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);   
    var url = Uri.UnescapeDataString(urlHelper.Action(action)).ToLowerInvariant();  
    var linkTagBuilder = new TagBuilder("a");   
    linkTagBuilder.MergeAttribute("href", url);
    linkTagBuilder.InnerHtml = linkText;
    return linkTagBuilder.ToString();
}
1 голос
/ 22 декабря 2009

Ваши файлы aspx физически сохранены в iso-8859-1?

«Файл / Сохранить Xyz как» И нажмите справа от кнопки «Сохранить», чтобы получить больше параметров кодирования для сохранения файла в ..

Догадка

0 голосов
/ 05 января 2012

Несколько вещей, которые вы могли бы рассмотреть.

Во-первых, если вы еще не прочитали его - я настоятельно рекомендую прочитать статью Джоэла Спольски «Абсолютный минимум, который должен знать каждый разработчик программного обеспечения, абсолютно и точно должен знать о Юникоде и наборах символов (без извинений!)» * * Это создает основу для изучения кодировки и программирования символов.

Во-вторых, при просмотре документации по элементу глобализации в web.config звучит так, что есть способы (случайно?) Переопределить указанную схему кодирования. Из документов:

requestEncoding

Указывает предполагаемую кодировку каждого входящего запроса, включая размещенные данные и строка запроса. Если запрос приходит с запросом заголовок, содержащий атрибут Accept-Charset , он переопределяет requestEncoding в конфигурации. Кодировка по умолчанию - UTF-8, указанный в теге <globalization>, включенном в Machine.config файл, созданный при установке .NET Framework. Если запросить кодировку не указывается в файле Machine.config или Web.config, кодировка по умолчанию используется региональная настройка компьютера. В односерверные приложения, кодирование запроса и кодирование ответа должно быть таким же. Для менее распространенного случая (несколько серверов приложения, где кодировки сервера по умолчанию разные), вы может изменить кодировку запроса и ответа, используя локальный Web.config файлы.

Вы пытались использовать что-то вроде Fiddler до посмотреть, что атрибут Accept-Charset установлен на ?

0 голосов
/ 28 декабря 2009

Я нашел проблему и обходной путь: я получаю значение UTF-8, но если я пытаюсь использовать System.Text.Encoding.UTF8.GetBytes (name), он преобразует символы «Ã ©» в UTF-8 значения вместо "É".

Обходной путь - скопировать строку в байт [], а затем использовать System.Text.Encoding.Convert ().

Я не знаю, лучший ли это путь, но теперь у меня все работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...