如何在属性文件中正确存储和检索国际化字符串?

时间:2008-10-11 18:43:43

标签: java encoding properties internationalization

我正在通过制作一个使用属性文件+ ResourceBundle来获取不同字符串的Hello World程序来试验国际化。

具体来说,我有一个存储“hello.world = Hello World!”的文件“messages_en_US.properties”,当然可以正常工作。

然后我有一个文件“messages_ja_JP.properties”,我尝试了各种各样的东西,但它总是在打印到控制台或Swing时显示为某种类型的乱码。问题显然是将内容读入Java字符串,因为日文中直接输入源代码的Java字符串可以正常打印。

我尝试过的事情:

  • UTF-8编码的.properties文件,其中日语字符串为as-is。我读到的东西表明Java期望一个属性文件是系统的本机编码......?它无论如何都无效。
  • 默认编码(ISO-8859-1)中的文件,以及由Java附带的native2ascii程序创建的转义Unicode存储的值。尝试使用各种日文编码的源文件... SHIFT-JIS,EUC-JP,ISO-2022-JP。

修改

当我打字时,我确实想到了这一点,但我想我还是会发布它并回答它以防万一。

3 个答案:

答案 0 :(得分:2)

我意识到native2ascii假设(惊讶)它每次都从我的操作系统的默认编码转换,因此不会生成正确的转义Unicode字符串。

使用“-encoding encoding_name ”选项运行native2ascii,其中 encoding_name 是源文件编码的名称(在本例中为SHIFT-JIS),产生了正确的结果,一切正常。

Ant还有一个native2ascii任务,它在一组输入文件上运行native2ascii,并在任何你想要的地方发送输出文件,所以我能够添加一个在Eclipse中执行此操作的构建器,以便我的源文件夹中包含原始字符串编码以便于编辑和构建,自动将转换后的文件放在输出文件夹中。

答案 1 :(得分:1)

从JDK 1.6开始,Properties有一个接受Reader的load()方法。这意味着您可以将所有属性文件保存为UTF-8,并通过将InputStreamReader传递给load()直接读取它们。我认为这是最优雅的解决方案,但它需要您的应用程序在Java 6运行时运行。

历史上,load()仅接受InputStream,并且流被解码为ISO-8859-1。 系统默认编码,始终为ISO-8859-1。这很重要,因为它可以实现某种黑客攻击。假设您的属性文件存储为UTF-8。检索属性后,您可以将其重新编码为ISO-8859-1并再次将其解码为UTF-8,如下所示:

String realProp = new String(prop.getBytes("ISO-8859-1"), "UTF-8");

它既丑陋又脆弱,但确实有效。但我认为最好的解决方案,至少在接下来的几年里,是你找到的解决方案:使用像Ant这样的构建工具使用native2ascii批量转换文件。

答案 2 :(得分:0)

处理属性文件的另一种方法是: http://www.unipad.org/main/

这是一个可以用\ uicode转义格式读/写文件的编辑器,这是native2ascii创建的格式。

它不知道它对日本人的效果如何,我把它用于匈牙利语。