如何将JSF消息编码设置为UTF-8?

tsd*_*sds 6 java jsf utf-8 character-encoding

我有一些用户输入验证的代码

<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>
Run Code Online (Sandbox Code Playgroud)

它工作正常,但如果用户输入无效,我需要显示一些UTF-8消息,
我该怎么做?

Bal*_*usC 18

我假设你当前的问题是ISO-8859-1范围之外的字符被显示为mojibake.这是真的?我想不出提出这个微不足道的问题的另一个原因.是?然后预读:

首先,如果您仍在使用旧JSP而不是其后继Facelets,那么您需要将页面编码设置为UTF-8.把它放在每个JSP的顶部:

<%@page pageEncoding="UTF-8" %>
Run Code Online (Sandbox Code Playgroud)

或者在全球范围内配置它web.xml:

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <page-encoding>UTF-8</page-encoding>
    </jsp-property-group>
</jsp-config>
Run Code Online (Sandbox Code Playgroud)

如果您使用的是Facelets,则无需执行任何操作.它默认使用UTF-8作为响应编码.

其次,如果您从.properties文件中获取消息,则需要了解默认情况下这些文件是使用ISO-8859-1读取的.另见java.util.Propertiesjavadoc:

..输入/输出流以ISO 8859-1字符编码进行编码.无法在此编码中直接表示的字符可以使用Unicode转义编写; 在转义序列中只允许一个'u'字符.该native2ascii工具可用于将属性文件转换为其他字符编码或从其他字符编码转换.

因此,您需要通过Unicode转义序列记下ISO-8859-1范围之外的字符.而不是

some.dutch.text = Één van de wijken van Curaçao heet Saliña.
Run Code Online (Sandbox Code Playgroud)

你需要写

some.dutch.text = \u00c9\u00e9n van de wijken van Cura\u00e7ao heet Sali\u00f1a.
Run Code Online (Sandbox Code Playgroud)

这可以通过使用native2ascii工具自动完成.

作为一个完全不同的替代方案,您可以为JSF提供一个自定义ResourceBundle实现,该实现Control使用UTF-8读取文件.在本回答本博客对此进行了更详细的介绍.这仅适用于您自己提供验证消息的情况,例如,requiredMessage而不是覆盖JSF默认验证消息.除此之外(即你需要<message-bundle>文件),你真的需要使用该native2ascii工具.

也可以看看: