Поврежденные персонажи снова отображаются во входах после отправки формы - PullRequest
8 голосов
/ 07 ноября 2011

Я обычно могу записать чешскую строку в форму:

enter image description here

Но после проверки (а также когда я отправляю собранную строку в базу данных) строка находится в некотором другом наборе символов:

enter image description here

h:outputTexts (jméno, příjmení) по-прежнему отображаются нормально, h:inputTexts - нет.

Где искать проблему?

ОБНОВЛЕНИЕ: Заголовки ответа HTTP:

enter image description here

РЕШЕНИЕ:

  • создатьфильтр с request.setCharacterEncoding("UTF-8") in Filter#doFilter()
  • проверить все xml, чтобы настроить UTF-8
  • добавить <f:view contentType="text/html" encoding="UTF-8"/> к основному xhtml
  • добавить эти строки вhibernate.cfg.xml:

    <property name="hibernate.connection.characterEncoding">utf8</property>

    <property name="hibernate.connection.useUnicode">true</property>

Ответы [ 3 ]

4 голосов
/ 07 ноября 2011

Учитывая симптомы, данные UTF-8 повторно отображаются с использованием кодировки ISO-8859-x. č ( ЛАТИНСКОЕ МАЛЕНЬКОЕ ПИСЬМО C С CARON (U + 010D) ) существует в UTF-8 байтов 0xC4 и 0x8D. В соответствии с макетом кодовой страницы ISO-8859-1 эти байты представляют символы Ä и [ничто] соответственно, что именно то, что вы видите.

Эта конкретная проблема может иметь много причин. Поскольку Facelets сам по себе уже использует UTF-8 по умолчанию для обработки параметров запроса HTTP POST и для записи ответа HTTP, не должно быть / не может быть ничего, что вам нужно исправить / изменить на стороне Java / JSF.

Однако, когда вы вручную захватываете параметр запроса до того, как JSF создаст / восстановит представление (например, в пользовательском фильтре), тогда Facelets может быть слишком поздно, чтобы установить правильную кодировку символов запроса. Вам нужно добавить следующую строку в пользовательский фильтр перед продолжением цепочки или в новый фильтр, который сопоставлен перед фильтром, вызывающим проблему:

request.setCharacterEncoding("UTF-8");

Кроме того, если вы явно / неявно изменили кодировку символов Facelets по умолчанию, например, <?xml version="1.0" charset="ISO-8859-1"?> или <f:view encoding="ISO-8859-1">, то Facelets вместо этого будет использовать ISO-8859-1. Вам нужно будет заменить его на UTF-8 или полностью удалить.

Если это не так, то основным подозреваемым является только сторона базы данных. В этой части я вижу две возможные причины:

  1. Таблица БД не использует UTF-8.
  2. Драйвер JDBC не использует UTF-8.

Как именно это решить, зависит от используемого сервера БД. Обычно вам нужно указывать кодировку во время CREATE таблицы БД, но вы также можете изменить ее, используя ALTER. Что касается драйвера JDBC, это обычно решается путем явного указания кодировки в качестве параметра URL-адреса соединения. Например, в случае MySQL:

jdbc:mysql://localhost:3306/db_name?useUnicode=yes&characterEncoding=UTF-8

Смотри также:

4 голосов
/ 07 ноября 2011

Попробуйте это решение: http://ibnaziz.wordpress.com/2008/06/10/spring-utf-8-conversion-using-characterencodingfilter/ В моих случаях это помогает (с русским языком)

В web.xml добавить фильтр кодировки символов Spring:

<filter>
    <filter-name>encodingFilter</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>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
 </filter-mapping>
0 голосов
/ 25 марта 2015

У меня была точно такая же проблема с формой проверки, и я решил ее с помощью ответа Сергея.

НО ваш фильтр должен быть на первой позиции в вашем web.xml.Перемещение моего фильтра с 3-й позиции на первую решило мою проблему.

Надеюсь, это поможет.

(Primefaces 3.2, JSF 2.1.2 с Jboss 7.1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...