2011-12-22 5 views
4

У меня возникла проблема с кодировкой кодировки в моем веб-приложении (JSF 1.2, Spring и Tomcat 7), и у меня закончились идеи о том, что тестировать, чтобы увидеть, где это идет не так.Параметры POST с использованием неправильного кодирования в JSF 1.2

Всякий раз, когда я представить что-то вроде «CA» я получаю «Ã§Ã £»: это означает, что мои данные, перенесенным UTF-8 преобразовываются в ISO-8859-1 где-то в жизненном цикле JSF.

Я знаю, что неправильное преобразование UTF-8 в ISO-8859-1 потому что это тот же выход для:

System.out.println(new String("çã".getBytes("UTF-8"), "ISO-8859-1")); 

Я считаю, что неправильно преобразование находится где-то в жизненном цикле JSF (может это быть раньше), потому что я создал валидатор в моем MB:

public void debugValidator(FacesContext context, UIComponent component, 
     Object object) throws ValidationException { 
    System.out.println("debug validator:"); 
    System.out.println(object); 
    System.out.println("\n"); 
    throw new ValidationException("DEBUG: " + object.toString()); 
} 

и его сообщение возвращается как: "DEBUG: çà £"

  • У меня есть на всех моих .xhtml страницах первая строка как <?xml version="1.0" encoding="UTF-8"?>.
  • Я использую Facelets, которые в соответствии с BalusC's article использует UTF-8 по умолчанию
  • Так что не нужно было, но я настраивал так или иначе, Спринг CharacterEncodingFilter в моем web.xml установить кодировку запроса символов в UTF-8.
  • Я поставил URIEncoding="UTF-8" в файле Tomcat в server.xml, просто чтобы гарантировать
  • Это не вина моего браузера, он печатает то же самое в консоли, и мое окружение все UTF-8.

Есть ли у вас какие-либо идеи, что еще можно проверить? Что может быть моим неправильным предположением?

Заранее благодарен!

ответ

7

ответ BalusC помог мне лучше понять эту проблему, но то, что решить это для меня помещал Character Encoding фильтр, как первый фильтр в цепи (поставив его выше всех остальных в web.xml файл).

Это фильтр я использовал:

<!-- filter enforcing charset UTF-8 - must be first filter in the chain! --> 
<filter> 
    <filter-name>characterEncodingFilter</filter-name> 
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>utf-8</param-value> 
    </init-param> 
    <init-param> 
     <param-name>forceEncoding</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>characterEncodingFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

По-видимому, данные считывали до того, как параметр был установлен с помощью фильтра. Я получил подсказку в этой странице: http://tech.top21.de/techblog/20100421-solving-problems-with-request-parameter-encoding.html

Спасибо всем!

3

Симптомы указывают на то, что браузер отправил данные с использованием кодировки ISO-8859-1 вместо UTF-8. Это, в свою очередь, означает, что заголовок HTTP ответа Content-Type не задан с соответствующим атрибутом charset. В, например Firebug, вы можете найти его следующим образом:

enter image description here

Вы правы, что Facelets использует UTF-8 по умолчанию. Но очень ранние версии Facelets не были запрограммированы на использование UTF-8 по умолчанию. См. Также среди других issue 46 и issue 53. Facelets в настоящее время находится в 1.1.15.B1.

Что касается ваших попыток исправить это, присутствие пролога XML не является строго необходимым, и его кодировка не используется каким-либо образом для установки кодировки ответа, она используется только парсером XML для декодирования входного потока для персонажи. Фильтр Spring также не нужен, но он не решил проблему после того, как вы добавили ее, достаточно доказательств того, что именно клиент отправил данные как ISO-8859-1.

+0

Привет, BalusC, спасибо за ваш ответ, но я думаю, что это наоборот, вызвать заголовок Content-Type установлен в UTF-8. Теперь, я только что проверил, изменил ли я кодировку в браузере вручную на ISO-8859-1, символы отображаются прямо в сообщении валидатора! Теперь, что это значит? – elias

+0

О Facelets, я использую 1.1.15.B1 кстати. – elias

+0

Возможно ли, что браузер отправляет данные как ISO-8859-1, несмотря на то, что для _Content-type_ установлено значение _text/html; charset = UTF-8_? – elias

1

Проверьте, если у вашей формы enctype="multipart/form-data".

См this question форма больше информации

Смежные вопросы