我正在通过制作一个使用属性文件+ ResourceBundle来获取不同字符串的Hello World程序来试验国际化。
具体来说,我有一个存储“hello.world = Hello World!”的文件“messages_en_US.properties”,当然可以正常工作。
然后我有一个文件“messages_ja_JP.properties”,我尝试了各种各样的东西,但它总是在打印到控制台或Swing时显示为某种类型的乱码。问题显然是将内容读入Java字符串,因为日文中直接输入源代码的Java字符串可以正常打印。
我尝试过的事情:
修改
当我打字时,我确实想到了这一点,但我想我还是会发布它并回答它以防万一。
答案 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创建的格式。
它不知道它对日本人的效果如何,我把它用于匈牙利语。