我有以下代码用于一些用户输入验证
<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消息,
我该怎么做?
我认为您当前的问题是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转义来编写;转义序列中只允许使用单个"u"字符。
native2ascii
工具可用于将特性文件转换为其他字符编码或从其他字符编码转换特性文件。
所以,您需要通过Unicode转义序列来写下ISO-8859-1范围之外的字符。例如,代替
some.dutch.text = Één van de wijken van Curaçao heet Saliña.
你需要写
some.dutch.text = u00c9u00e9n van de wijken van Curau00e7ao heet Saliu00f1a.
这可以通过使用native2ascii
工具实现自动化。
作为一种完全不同的选择,您可以为JSF提供一个自定义ResourceBundle
实现和一个自定义的Control
,后者使用UTF-8读取文件。这在这个答案和这个博客中得到了更详细的扩展。只有当您自己提供验证消息(例如requiredMessage
(而不是覆盖JSF默认验证消息时,这才有效。除此之外(即<message-bundle>
文件需要它(,您还需要使用native2ascii
工具。
另请参阅:
- Unicode-如何正确输入字符