【问题标题】:Why UTF-8 as native2ascii encoding option rather than ISO-8859-1?为什么 UTF-8 作为 native2ascii 编码选项而不是 ISO-8859-1?
【发布时间】: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


【解决方案1】:

-encoding 需要与源文件中使用的实际编码相匹配。从外观上看,那是UTF-8。 – Thilo 4 月 3 日 2:52

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多