Как установить кодировку сообщений JSF в UTF-8? - PullRequest
6 голосов
/ 30 августа 2011

У меня есть следующий код для проверки пользовательского ввода

<h:form>
    <h:inputText value="#{user.input}">
        <f:validator validatorId="validator.InputValidator" />
    </h:inputText>
    <h:commandButton action="someaction" value="submit">
    </h:commandButton>
    <h:messages layout="table"></h:messages>
</h:form>

Он работает нормально, но мне нужно показать какое-то сообщение UTF-8, если ввод пользователя недействителен,
как я могу это сделатьэто?

1 Ответ

18 голосов
/ 30 августа 2011

Я предполагаю, что ваша текущая проблема заключается в том, что символы вне диапазона ISO-8859-1 показаны как mojibake . Это правда? Я не мог придумать другую причину задать этот тривиальный вопрос. Да? Тогда читайте вперед:

Во-первых, если вы все еще используете старый JSP вместо его преемников Facelets, тогда вам нужно установить кодировку страницы в UTF-8. Поместите это в верхней части каждого JSP:

<%@page pageEncoding="UTF-8" %>

или настройте его глобально в web.xml:

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <page-encoding>UTF-8</page-encoding>
    </jsp-property-group>
</jsp-config>

Если вы используете Facelets, вам не нужно ничего делать. По умолчанию он уже использует UTF-8 в качестве кодировки ответа.

Во-вторых, если вы получаете сообщения из файлов .properties, вам необходимо понимать, что эти файлы по умолчанию считываются с использованием ISO-8859-1. См. Также java.util.Properties javadoc :

.. поток ввода / вывода кодируется в кодировке символов ISO 8859-1. Символы, которые не могут быть непосредственно представлены в этой кодировке, могут быть написаны с использованием экранирования Unicode; в escape-последовательности допускается только один символ 'u'. Инструмент native2ascii можно использовать для преобразования файлов свойств в другие кодировки и из них.

Итак, вам нужно записать символы вне диапазона ISO-8859-1 с помощью escape-последовательностей Unicode . Например. вместо

some.dutch.text = Één van de wijken van Curaçao heet Saliña.

нужно написать

some.dutch.text = \u00c9\u00e9n van de wijken van Cura\u00e7ao heet Sali\u00f1a.

Это можно автоматизировать с помощью инструмента native2ascii.

В качестве совершенно другой альтернативы вы можете предоставить JSF пользовательскую реализацию ResourceBundle с пользовательской Control, которая читает файлы с использованием UTF-8. Более подробно это раскрыто в этом ответе и в этом блоге . Это работает только тогда, когда вы сами предоставляете сообщения проверки, например, requiredMessage, вместо переопределения сообщений проверки JSF по умолчанию. Кроме этого (т. Е. Он нужен для <message-bundle> файлов), вам действительно нужно использовать инструмент native2ascii.

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

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