Java ResourceBundles变音符号搞砸了

时间:2016-04-13 08:49:47

标签: java character-encoding internationalization resourcebundle

我在属性文件中遇到德语“变音符号”的问题。现在我完全得到了我必须转义超出ISO-8859-1范围的字符,并且我过去使用了native-to-ascii转换。

但为什么像“ü”这样的变形虫也搞砸了呢?它们是ISO-8859-1的一部分,如果阅读文档,则使用ISO-8859-1读取Java中的ResourceBundles。我也使用该编码为我的属性文件。 有人可以告诉我为什么会这样吗?

示例代码:

创建包含以下消息的.properties(确保将其保存为ISO-8859-1)

testMessage=ä ü ö Ä Ü Ö this message is used to test ResourceBundle - loading!

使用以下testmethod创建一个测试类:

@Test
public void testEncoding() {
    String mess = ResourceBundle.getBundle("i18n.messages").getString("testMessage");
    Assert.assertEquals("ä ü ö Ä Ü Ö this message is used to test ResourceBundle - loading!", mess);
}

现在我的情况是结果是:

org.junit.ComparisonFailure: 
Expected :ä ü ö Ä Ü Ö this message is used to test ResourceBundle - loading!
Actual   :� � � � � � this message is used to test ResourceBundle - loading!

*修改: 这似乎是我的IntelliJ的一个问题。如果我执行单元测试并检查target / i18n / messages.properties,那么属性已经搞砸了。我仔细检查了源文件的编码(在记事本中)并且还验证了我的IDE将其解释为ISO-8859-1。仍然没有线索:(

2 个答案:

答案 0 :(得分:2)

转换为ResourceBundle时,

ISO-8859-1String格式加载内容。我在项目中使用的一个解决方案(糟糕的黑客?)如下:

我获取String值,获取其字节并使用new String编码创建UTF-8。这解决了我与变音符号的问题。

new String(ResourceBundle.getBundle("your.folder").getString("testMessage").getBytes("ISO-8859-1"), "UTF-8");

答案 1 :(得分:1)

使用Eclipse和ISO-8859-1编码的属性文件,您的测试运行正常。但请注意,您提供的两个字符串不同:

ä ü ö Ä Ü Ö this message is used to test ResourceBundle - loading

VS

ä ü ö Ä Ü Ö this message is used to test resource Bundle-loading

因此,测试可能因此而失败,并且输出刚刚搞砸了,因为您的控制台/日志文件的编码不正确?