我在属性文件中遇到德语“变音符号”的问题。现在我完全得到了我必须转义超出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。仍然没有线索:(
答案 0 :(得分:2)
ResourceBundle
时, ISO-8859-1
以String
格式加载内容。我在项目中使用的一个解决方案(糟糕的黑客?)如下:
我获取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
因此,测试可能因此而失败,并且输出刚刚搞砸了,因为您的控制台/日志文件的编码不正确?