Параметры POST с использованием неправильной кодировки в JSF 1.2 - PullRequest
4 голосов
/ 23 декабря 2011

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

Когда я отправляю что-то вроде 'çã', я получаю 'çà £': это означает, что мои данные, помеченные как UTF-8 , преобразуются в ISO-8859-1 где-то в жизненном цикле JSF.

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

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

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

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 по умолчанию использует UTF-8
  • Так что в этом нет необходимости, но я все равно настроил CharacterEncodingFilter Spring в моем web.xml , чтобы установить кодировку символа запроса в UTF-8.
  • Я положил URIEncoding="UTF-8" в файл Tomcat server.xml, просто чтобы гарантировать
  • Это не ошибка моего браузера, он печатает то же самое в консоли, и все мое окружение UTF-8.

У вас есть идеи, что еще я могу проверить?В чем может быть мое неправильное предположение?

Заранее спасибо!

Ответы [ 3 ]

7 голосов
/ 23 декабря 2011

Ответ BalusC помог мне лучше понять проблему, но что решило ее для меня, так это использование фильтра кодировки символов в качестве ПЕРВОГО фильтра в цепочке (поместив его выше всех остальных в web.xml file).

Это фильтр, который я использовал:

<!-- 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 голосов
/ 23 декабря 2011

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

enter image description here

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

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

1 голос
/ 04 апреля 2012

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

См. этот вопрос Форма получения дополнительной информации

...