3

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

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

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

我尝试过的事情:

  • 采用 UTF-8 编码的 .properties 文件,其值按原样使用日语字符串。我读到的东西表明Java希望属性文件处于系统的本机编码中......?无论如何,它都不起作用。
  • 默认编码 (ISO-8859-1) 中的文件和存储为转义 Unicode 的值,由 Java 中包含的 native2ascii 程序创建。尝试使用各种日语编码的源文件... SHIFT-JIS、EUC-JP、ISO-2022-JP。

编辑:

实际上,我在键入此内容时就想到了这一点,但我想无论如何我都会将其发布并回答以防万一。

4

3 回答 3

3

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

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

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

于 2008-10-11T18:44:01.460 回答
2

从 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 批量转换文件。

于 2008-10-11T23:07:08.747 回答
0

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

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

它不知道它与日语的效果如何,我已经将它用于匈牙利语。

于 2008-10-11T20:40:28.307 回答