Java属性:显示而不是ä

时间:2015-04-14 13:53:25

标签: java properties

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

elsi.log.status.1              = Keine Änderungen

但是我的网页上没有正确显示字符Ä。 输出是�

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

这是用于从java中的propertyfile获取值的方法。当我调试时,这里的值已经完全错误了(bundle.getString(key)返回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}" />

我还注意到用hexcodes替换属性文件中的字符会有所帮助,但我想知道是否可以这样做。

感谢您的帮助

2 个答案:

答案 0 :(得分:4)

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

目前我可以想到2个解决方案:

  1. 用编码形式替换每个特殊字符,例如通过使用æ等形式的\u00E4形式的unicode点
  2. 因为Java 5 ResourceBundle提供了一种读取UTF-8文件的方法,尽管内部缓存和回退机制在这种情况下不起作用,你必须自己做。
  3. 更新:而不是no的示例。 2,请看这里:How to use UTF-8 in resource properties with ResourceBundle

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

答案 1 :(得分:0)

属性文件在ISO-8859-1中进行了硬编码。 如果您的页面有其他编码(例如,UTF-8),您将编码问题。

幸运的是,Java ResourceBundles提供了另一种方法:使用XML文件。 您不必更改代码中的任何内容,只需使用java.util.Properties文件的javadoc中所述的XML格式。如果您在XML标头中指定了这些文件,则可以使用任何编码进行编码。

其doctype是

<!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>