Вопрос

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

Я также обновляю объект ответа на основе кодовой страницы для выбранной страны и устанавливаю его 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);
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top