Учитывая симптомы, данные 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
или полностью удалить.
Если это не так, то основным подозреваемым является только сторона базы данных. В этой части я вижу две возможные причины:
- Таблица БД не использует UTF-8.
- Драйвер JDBC не использует UTF-8.
Как именно это решить, зависит от используемого сервера БД. Обычно вам нужно указывать кодировку во время CREATE
таблицы БД, но вы также можете изменить ее, используя ALTER
. Что касается драйвера JDBC, это обычно решается путем явного указания кодировки в качестве параметра URL-адреса соединения. Например, в случае MySQL:
jdbc:mysql://localhost:3306/db_name?useUnicode=yes&characterEncoding=UTF-8
Смотри также: