我在属性文件中遇到德语“变音符”的问题.现在我完全明白,我必须转义超出ISO-8859-1范围的字符,并且为此使用了过去的本机到ascii转换.
但是,为什么像“ü”这样的变音符也弄乱了呢?它们是ISO-8859-1的一部分,如果阅读了文档权Java中的ResourceBundles,则使用ISO-8859-1进行了读取.我也为我的属性文件使用该编码.
有人可以启发我为什么会这样吗?
示例代码:
创建一个包含以下消息的.properties(确保将其保存为ISO-8859-1)
testMessage=ä ü ö Ä Ü Ö this message is used to test ResourceBundle - loading!
使用以下测试方法创建一个测试类:
@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.还是没有头绪:(
解决方法:
当转换为字符串时,ResourceBundle以ISO-8859-1格式加载内容.我在项目中使用的一种解决方案(严重破解?)如下:
我得到了字符串值,得到了它的字节,并用UTF-8编码创建了一个新的字符串.这样可以解决我的变音符号问题.
new String(ResourceBundle.getBundle("your.folder").getString("testMessage").getBytes("ISO-8859-1"), "UTF-8");