2010-05-28 3 views
1

У меня есть веб-приложение (ну, на самом деле это просто сервлет), который получает данные от 3-х различных источников:Сервлет получает данные как в ISO-8859-1, так и в UTF-8. Как URL-декодировать?

  • Источник А представляет собой HTML-документ, написанный в UTF-8, и передает данные через <form method="get"> ,
  • Источник B написан в ISO-8859-1 и отправляет данные через <form method="get">.
  • Источник C написан в ISO-8859-1 и отправляет данные через <a href="http://my-servlet-url?param=value&param2=value2&etc">.

Сервлет получает параметры запроса и URL-декодирует их с использованием UTF-8. Как и следовало ожидать, A работает без проблем, в то время как B и C сбой (вы не можете URL-декодировать в UTF-8 то, что закодировано в ISO-8859-1 ...).

Я могу внести небольшие изменения в B и C, но мне не разрешено изменять их с ISO-8859-1 на UTF-8, что позволило бы решить все проблемы.

В B я смог решить проблему, добавив accept-charset="UTF-8" к <form>. Таким образом, он отправляет данные в UTF-8, даже если страница является ISO.

Что мне делать, чтобы исправить C?

В качестве альтернативы, есть ли способ определить кодировку на сервлете, чтобы я мог вызывать URL-декодирование с правильной кодировкой в ​​каждом случае?


Edit: Я только что нашел this, который, кажется, чтобы решить мою проблему. Мне еще нужно сделать несколько тестов, чтобы определить, влияет ли это на производительность, но я думаю, что я буду придерживаться этого решения.

+0

Как насчет ' '? – zildjohn01

+0

Хммм .. Я бы предпочел не добавлять в запрос больше параметров ... но я думаю, что так оно и должно работать. Я попробую. Благодаря! :) – AJPerez

+0

В этом подходе я думаю, что главная страница поиска Google включает (или включает) параметр «ie» ... Слишком ленив для тестирования сейчас http://www.seomoz.org/ugc/the-ultimate-guide -to-the-google-search-parameters – leonbloy

ответ

0

Я отвечаю на себя для того, чтобы отметить вопрос решен:

Я нашел this question, который охватывает точно такая же проблема, я обращенную. Для меня было решение javax.servlet.Filter.

3

Браузер по умолчанию отправит данные в ту же кодировку, что и запрашиваемая страница. Это управляется заголовком HTTP Content-Type, который вы также можете установить с помощью тега HTML <meta>.

Атрибут accept-charset элемента HTML <form> следует избегать, так как он поврежден в MSIE. Почти все кодировки, отличные от UTF-8, игнорируются и будут отправляться в кодировке по умолчанию платформы (обычно это CP-1252 в случае Windows).

Чтобы исправить A и B (POST), вам необходимо установить HttpServletRequest#setCharacterEncoding() перед тем, как собрать параметры запроса. Имейте в виду, что это одноразовая задача. Вы не можете получить параметр, а затем изменить кодировку, а затем «повторно получить» параметры.

Чтобы исправить C (GET), вам в основном нужно установить кодировку URI запроса в конфигурации сервера. Поскольку неясно, какой сервер вы используете, вот Tomcat таргетинг примера: в HTTP connector установить следующий атрибут:

<Connector (...) URIEncoding="ISO-8859-1" /> 

Однако это уже кодировка по умолчанию в большинстве серверов. Поэтому вам, возможно, не нужно ничего делать для C.

В качестве альтернативы, можно захватить сырые и не-URL-кодированные данные из тела запроса (в случае POST) путем HttpServletRequest#getInputStream() или из строки запроса (в случае GET) путем HttpServletRequest#getQueryString() и затем предположение кодирование на основе символов, доступных в параметрах, а затем URL-encode соответственно с использованием предполагаемой кодировки. Скрытый элемент ввода со специфическим символом, который отличается как в UTF-8, так и в ISO-8859-1, может помочь в этом.

+0

Вы уверены, что 'accept-encoding' работает только в MSIE? Моя страница ISO-8859-1 теперь корректно отправляет данные в UTF-8 (попробовала его в Chrome и Firefox). Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, какая кодировка используется в каждом случае, ISO-8859-1 или UTF-8. Поэтому я не могу использовать 'setCharacterEncoding()'. Я надеюсь, что предложение zildjohn01 поможет определить его. – AJPerez