Java 属性:显示 � 而不是 ä

Java properties : � displayed instead of ä

我有一个包含以下键和值的 属性 文件:

elsi.log.status.1              = Keine Änderungen

但是字符 Ä 在我的网页上显示不正确。 输出为 �

但是如果我使用 faces-config 然后直接显示来自 xhtml 的消息,则消息显示与 属性 文件中的相同

这是用于从 java 中的 属性 文件获取值的方法。当我调试时,这里的值已经是错误的 (bundle.getString(key) returns Keine �nderungen)

    public static String getString(String key) {
    try {
        Locale locale = CurrentEnvironment.getLocale();
        ResourceBundle bundle = ResourceBundle.getBundle(BUNDLE_NAME, locale);
        if (bundle != null) {
            return bundle.getString(key);
        }
    } catch (MissingResourceException e) {
        return '!' + key + '!';
    }
    return '!' + key + '!';
}

使用 xhtml 直接输出有效

<h:outputText value="#{messages.elsi_copyright}" />

我还注意到用十六进制代码替换 属性 文件中的字符有帮助,但我想知道是否可以这样做。

感谢您的帮助

问题是 ResourceBundle.getBundle() 使用 ISO Latin-1 编码来读取包,因此无法解释 UTF-8 文件(插入非 Latin-1 字符如 ä 时会出现这种情况等)。

目前我能想到2种解决方案:

  1. 用编码形式替换每个特殊字符,例如通过使用形式为 \u00E4 的 unicode 点代表 ä 等
  2. since Java 5 ResourceBundle 提供了一种读取 UTF-8 文件的方法,尽管内部缓存和回退机制在这种情况下不起作用,您必须自己进行操作。

更新:而不是一个例子。 2、请看这里:How to use UTF-8 in resource properties with ResourceBundle

有很多好的资源可以帮助您以适合您需要的方式处理包含变音符号等的包。

属性 文件在 ISO-8859-1 中是 hard-encoded。 如果您的页面使用其他编码(例如 UTF-8),您将遇到编码问题。

幸运的是,Java ResourceBundle 提供了另一种方法:使用 XML 文件。 您不必更改代码中的任何内容,只需使用 java.util.Properties 文件的 javadoc 中描述的 XML 格式即可。这些文件可以用任何编码进行编码,前提是您在 XML header.

中指定它

它的文档类型是

<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">

示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<entry key="com.compant.key1">value1</entry>
<entry key="com.company.key2">value2</entry>
...
</properties>