Установка Request.ContentEncoding - PullRequest
0 голосов
/ 21 января 2011

У меня есть страница, которая поддерживает несколько языков (пользователь может изменить язык в любое время).
Я обновляю культуру потока на основе выбора пользователя в методе Initialize Culture.

Я также обновляю объект ответа на основе кодовой страницы для выбранной страны и устанавливаю для его кодировки значение WebName используемой кодировки (если я не обновляю объект ответа на основе кодовой страницы, тогда данные привязываются управление искажено). Файлы ресурсов также локализованы на основе кодовой страницы.

После внесения вышеуказанных изменений страница корректно отображается в браузере.

Однако, когда пользователь вводит данные на одном из азиатских языков, текст все перепутывается. Выпадающий список фактически выдает недопустимый аргумент обратного или обратного вызова.

При проверке request.contentEncoding я обнаружил, что это все еще UTF-8 (установлен в web.config).

Если я изменю request.ContentEncoding во время события BeginRequest, входные данные поступают правильно. Но я не уверен, что пользователь выбрал язык в начале цикла страниц.

Является ли приведенный выше подход правильным путем? Как я могу динамически установить кодировку для входящего запроса?

1 Ответ

1 голос
/ 13 февраля 2011

Запрос - это что-то, что клиент отправил вам. Вы не можете выбрать, что он посылает, это ваш вклад. Однако клиент, вероятно, должен отправлять эти входные данные в кодировке, определенной на странице, содержащей форму.

Правильно ли установлена ​​кодировка на странице? Вы уверены, что не отправляете, например,

<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />

в заголовке HTML, а данные в другой кодировке?

Добавлено после комментариев: Если я правильно понимаю, вы генерируете выходную страницу в кодировке, отличной от UTF-8 (вы уверены, что вам нужно это сделать?). После чего у вас возникают проблемы с декодированием данных формы POSTed обратно. Простейшим способом было бы обеспечить отправку данных обратно в UTF-8. Для этого HTML определяет атрибут accept-charset в form. Однако атрибут не поддерживается в IE. Для IE есть хак : вы можете попробовать добавить фальшивый <input>, содержащий любой «странный» символ Unicode, чтобы заставить IE писать как UTF-8.

Что не очень приятно, более простым решением было бы просто всегда использовать UTF-8 - вам действительно нужно использовать разные кодировки для вашей выходной страницы?

Или, если вам нужно вывести данные в другой кодировке, решение для установки Request.ContentEncoding - это единственный способ использовать AFAIAA. Чтобы определить используемую кодировку, я бы рекомендовал добавить скрытое поле, которое отправляется обратно POST (теоретически вы можете использовать заголовки HTTP, но я не думаю, что браузеры отправляют их с данными POST), чтобы использовать что-то вроде этого:

    public void Application_BeginRequest(object sender, EventArgs args)
    {
        var inputEncoding = Request.Form["hiddenEncoding"];
        if (!String.IsNullOrEmpty(inputEncoding)) Request.ContentEncoding = Encoding.GetEncoding(inputEncoding);
    }
...