Настройка запроса.contentEncoding
-
13-10-2019 - |
Вопрос
У меня есть страница, которая поддерживает несколько языков (пользователь может изменить язык в любое время).
Я обновляю культуру потока на основе выбора пользователя в методе инициализации культуры.
Я также обновляю объект ответа на основе кодовой страницы для выбранной страны и устанавливаю его charset на имя используемого кодирования (если я не обновлю объект ответа на основе страницы кода, то данные, связанные с элементами управления ) Файлы ресурсов также локализованы на основе кодовой страницы.
После внесения вышеупомянутых изменений страница правильно отображается в браузере.
Однако, когда пользователь вводит данные на одном из азиатских языков, текст все испортится. Выпадающий список фактически бросает исключение по неверному обратному вызову или исключению аргумента отправки.
При проверке запроса.contentEncoding я обнаружил, что он все еще был UTF-8 (установлен в web.config).
Если я изменим request.contentencoding во время события BeginRequest, вход входит правильно. Но я не уверен в выбранном пользователе языке в начале цикла страницы.
Является ли приведенный выше подход правильным способом сделать это? Как я могу динамически установить кодирование для входящего запроса?
Решение
Запрос - это то, что есть у клиента послал ты. Вы не можете выбрать то, что он отправляет, это ваш вклад. Тем не менее, клиент, вероятно, должен отправлять этот вход в кодировку, определенную на странице, содержащей форму.
Вы правильно устанавливаете Charset на странице? Вы уверены, что не отправляете, например
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
В заголовке HTML, в то время как данные находятся в другом кодировании?
Добавлено после комментариев: Если я понимаю это правильно, вы генерируете выходную страницу в другой кодировке, чем UTF-8 (вы уверены, что вам нужно это сделать?). После чего у вас есть проблемы, декодирующие данные формы, размещенные обратно. Самым простым способом было бы обеспечить размещение данных в UTF-8. Для этого HTML определяет accept-charset
атрибут на form
. Анкет Однако атрибут не поддерживается в IE. Для т.е. взломать: Вы можете попробовать добавить подделку <input>
содержащий любой «странный» символ Unicode, чтобы заставить IE Post как UTF-8.
Что не очень приятно, более простое решение будет просто использовать UTF-8-всегда-вам действительно нужно использовать разные кодировки для вашей выходной страницы?
Или, если вам нужно вывести данные в другом кодировании, ваше решение настройки Request.ContentEncoding
Afaiaa единственный способ использовать. Чтобы определить используемое кодирование, я бы порекомендовал добавить скрытое поле, которое размещено обратно (теоретически, вы можете использовать заголовки HTTP, но я не думаю, что браузеры отправляют их с опубликованными данными), чтобы использовать что -то вроде этого:
public void Application_BeginRequest(object sender, EventArgs args)
{
var inputEncoding = Request.Form["hiddenEncoding"];
if (!String.IsNullOrEmpty(inputEncoding)) Request.ContentEncoding = Encoding.GetEncoding(inputEncoding);
}