【问题标题】:Java ResourceBundles umlauts messed upJava ResourceBundles 变音符号搞砸了
【发布时间】:2016-04-13 08:49:46
【问题描述】:

我对属性文件中的德语“元音变音”有疑问。现在我完全明白我必须转义超出 ISO-8859-1 范围的字符,并且我过去为此使用了 native-to-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。还是没有头绪:(

【问题讨论】:

  • 这个测试对我来说运行得很好
  • 您确定将属性文件保存在 ISO-8859-1 中吗,因为它看起来像是以 UTF-8 保存的。
  • 更正,你所有的字符似乎都被编码为0xEFBFBD,这是UTF-8中的字符替换符号。
  • 我在上面编辑了我的答案。这似乎与我的 IDE 有关,如果我使用 Maven 执行测试,它可以正常工作。

标签: java character-encoding internationalization resourcebundle


【解决方案1】:

ResourceBundle 在转换为Strings 时以ISO-8859-1 格式加载内容。我在项目中使用的一种解决方案(坏黑客?)如下:

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

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

【讨论】:

  • 如果您需要这样做,那么您实际上将文件保存为 UTF-8,而不是 ISO-8859-1;更不用说您将丢失 ISO-8859-1 之外的任何字符,这些字符在属性文件中具有正确的 unicode 转义。
  • 当然我将文件保存为UTF-8,因为我想这样保存。这就是为什么ResourceBundle 将字符串加载为 ISO-8859-1 而不是 UTF-8 是一个问题。正确的 unicode 转义是没有问题的,因为我不想每次编辑我的属性时都写 \u00FC 而不是 ü
  • 我希望您知道并非所有字节都是有效的 ISO-8859-1,因此 UTF-8 中的某些字节组合根本无法以这种方式呈现。如果您真的想使用 UTF-8,您可能需要考虑改用 XML 格式。
  • 我知道这一点。幸运的是,我们没有使用如此广泛的 UTF-8。不过感谢您的想法。
  • 另一种选择是在构建过程中使用native2ascii
【解决方案2】:

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

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

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

所以也许测试因此而失败,并且输出只是因为您的控制台/日志文件的编码不正确而弄乱了?

【讨论】:

  • 感谢您指出这一点。我修复了上面的示例,但仍然是同样的问题。我已经考虑过控制台把事情搞砸了,并通过打印出特殊字符来测试它。这似乎不是问题。有趣的是,这对你有用。您是否正在使用一个 Eclipse 插件来进行本机到 ascii 的转换?
猜你喜欢
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 2016-04-16
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多