代码之家  ›  专栏  ›  技术社区  ›  ColinD

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

  •  2
  • ColinD  · 技术社区  · 16 年前

    我正在尝试国际化,制作一个hello world程序,使用properties files+resourcebundle获取不同的字符串。

    具体来说,我有一个文件“messages-en-u-us.properties”存储“hello.world=hello world!”当然可以。

    然后我有了一个文件“messages-ja-jp.properties”,我尝试了各种方法,但当打印到控制台或在Swing中时,它总是显示为某种乱码字符串。这个问题显然是把内容读入一个Java字符串中,作为一个Java字符串,在日语中直接输入源可以打印得很好。

    我尝试过的事情:

    • .properties文件采用UTF-8编码,其值为日语字符串。我读到的东西表明Java期望一个属性文件在系统的本机编码中……这两种方法都不管用。
    • 默认编码中的文件(ISO-859-1)和由Java包含的NATEV2ASCII程序创建的逃逸Unicode存储的值。尝试使用各种日语编码的源文件…shift-jis、euc-jp、iso-2022-jp。

    编辑:

    我在打字的时候发现了这个问题,但我想我还是会把它贴出来,然后回答它,以防它对任何人都有帮助。

    3 回复  |  直到 15 年前
        1
  •  2
  •   ColinD    16 年前

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

    使用“—编码运行native2ascii 代号 “选项在哪里 代号 源文件编码的名称(在本例中是shift-jis)是否产生了正确的结果,并且一切正常。

    Ant还有一个native2ascii任务,该任务在一组输入文件上运行native2ascii,并将输出文件发送到您想要的任何位置,因此我可以添加一个在Eclipse中执行此操作的生成器,以便源文件夹使用其原始编码的字符串,以便轻松编辑和构建,并自动将相同名称的转换文件放入输出文件夹。

        2
  •  1
  •   Alan Moore Chris Ballance    16 年前

    从JDK 1.6开始,属性具有 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批量转换文件。

        3
  •  0
  •   laszlot    16 年前

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

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

    它不知道它和日语有多好用,我把它用于匈牙利语。