【发布时间】:2013-04-03 02:44:55
【问题描述】:
在 Java 中创建 Properties 类时,要求输入流必须以 ISO-8859-1 编码。但在实践中,我使用 UTF-8 通过 native2ascii 工具而不是 ISO-8859-1 转换非拉丁属性文件。
- 根据 JDK 文档,输入流应编码为 ISO-8859-1。 也就是说,源文件是用 ISO-8859-1 编码的。
- 根据解码和编码应该使用相同的ISO-8859-1, Java 中的属性类应使用 ISO-8859-1 进行解码。
- 根据测试,实际上我们使用UTF-8作为编码 native2ascii 而不是 ISO-8859-1 中的选项。为什么?
测试如下:
- 创建 test.properties 文件,其中包含:“key=Ü”
-
生成的 ISO-8859-1 属性文件:key=\u00c3\u009c
native2ascii -encoding ISO-8859-1 test.properties iso88591.propertie: -
生成的 UTF-8 属性文件:key=\u00dc
native2ascii -encoding UTF-8 test.properties utf8.properties -
创建属性加载生成的两个属性文件:
Properties p = new Properties(); //InputStream inStream = new FileInputStream("src/test/java/com/active/translation/iso88591.properties"); InputStream inStream = new FileInputStream("src/test/java/com/active/translation/utf8.properties"); p.load(inStream); System.out.println(p.getProperty("key")); iso88591.propertie 结果为:Ã
- utf8.properties 结果为:Ü
答案:
-encoding 需要与源文件中使用的实际编码相匹配。从外观上看,那是UTF-8。 – Thilo 4 月 3 日 2:52
【问题讨论】:
-
“根据JDK doc,”具体是哪个JDK文档?
-
-encoding需要与源文件中使用的实际编码相匹配。从外观上看,就是UTF-8。 -
在 UNICODE 中,该字符是 U+00DC。在 UTF-8 编码中,它将是 0xC39C。当使用 ISO-8859-1 编码读取该文件时,它将 UTF-8 编码字符读取为两个 ISO-8859-1 编码字符:0xC3 0x09c。正如 Thilo 建议的那样,使 --encoding 参数与文件的实际编码相匹配。
-
JDK 文档:docs.oracle.com/javase/6/docs/api/java/util/Properties.html。 " 除了输入/输出流采用 ISO 8859-1 字符编码进行编码"
-
正如 Thilo 所建议的, -encoding 选项是源文件的实际编码。使用“ISO-8859-1”编码保存 test.properties 时,iso88591.propertie: key=\u00dc 和 getProperty("key") 的值是正确的。 'native2ascii -encoding ISO-8859-1 test.properties iso88591.propertie'
标签: java