【问题标题】:é is not correctly parsedé 未正确解析
【发布时间】:2008-11-16 09:40:39
【问题描述】:

我的应用程序将从 urlconnection 读取 xml。 xml 编码是 ISO-8859-1,它包含 é 字符。我使用 xerces saxparser 来解析收到的 xml 内容。但是,在 lunix OS 下运行应用程序时无法正确解析 é。在 Windows 中一切正常。你们能给我一些提示吗?非常感谢

【问题讨论】:

    标签: java linux xerces saxparser


    【解决方案1】:

    这可能是一个标记为“ISO-8859-1”的文件,而实际上它是另一种编码。

    “ISO-8859-1”和“Windows-2152”通常会发生这种情况:它们被使用时就好像它们可以互换一样,但事实并非如此。 (在此答案的 cmets 中,已澄清两种编码都同意“é”的字符代码,因此可能不是 Windows-1252。)

    您可以使用十六进制编辑器找出文件中“é”的确切字符代码。您可以将该值作为文件编码方式的提示。如果您可以控制文件的生成方式,则建议查看负责的代码/方法。

    【讨论】:

    • 我同意关于它们经常被混淆的陈述,并且它们实际上是不同的 - 但 e-acute 在 U+00E9 的 ISO-8859-1 中,所以我怀疑这不是问题这种特殊情况。
    • 那么文件可能已经以另一种编码保存。
    【解决方案2】:

    我敢打赌这与 file.encoding 有关。尝试在 Linux 上使用 -Dfile.encoding=iso-8859-1 作为 VM 参数运行。

    如果可行,您可能需要在打开流时(在代码中的某个位置)指定正确的格式。

    【讨论】:

      【解决方案3】:

      您应该做的第一件事是确定 xml 文件的真实编码,正如 Tomalak 建议的那样,而不是标题中所述的编码。

      您可以先使用 Internet Explorer 打开它。如果编码不正确,您可能会看到如下错误:

      在文本中发现无效字符 内容。错误处理资源 ...

      或以下一个:

      从当前编码切换到 不支持指定的编码。 错误处理资源...

      下一步是使用支持多种编码的文本编辑器。您可以使用免费、易于使用并支持多种编码的Notepad++。无论 xml 标头如何描述编码,编辑器都会尝试检测文件的编码并将其显示在状态栏上。

      如果您确定文件编码是正确的,那么您可能没有正确处理 Java 中的编码。考虑到 Java 字符串是 UTF-16 并且在从/到字节数组转换时默认情况下,如果未指定编码,Java 默认为系统编码(Windows 下的 Windows-1521 或现代 Linux 上的 UTF-8)。某些编码转换只会导致“奇怪”字符出现,例如固定 8 位编码之间的转换(即 Windows-1252 ISO-8859-1)。由于无效字符,其他转换会引发编码异常(例如,尝试将 Windows-1252 文本导入为 UTF-8)。

      无效代码示例如下:

      // Parse the input
      SAXParser saxParser = factory.newSAXParser();
      InputStream is = new ByteArrayInputStream(stringToParse.getBytes());
      saxParser.parse( is, handler );
      

      默认情况下,转换stringToParse.getBytes() 返回在 Windows 平台上编码为 Windows-1252 的字符串。如果在此步骤中 XML 文本以 ISO-8859-1 编码,则您的字符有误。正确的步骤应该是将 XML 读取为字节而不是字符串,并让 SAX 管理 xml 编码。

      【讨论】:

        【解决方案4】:

        如果 XML 声明未指定编码,则 sax 解析器将尝试使用默认编码 UTF-8。

        如果您知道字符编码但未在 XML 声明中指定,您可以告诉解析器将该编码与 InputSource 一起使用:

        InputSource inputSource = new InputSource(xmlInputStream);
        inputSource.setEncoding("ISO-8859-1");
        

        【讨论】:

        • 更准确地说:如果 XML 声明中未指定编码,则它必须使用 UTF-8。
        【解决方案5】:

        对不起,我的回复晚了。我们解决了这个问题。我们对输入流做了一些错误的操作(正如 Fernando Miguélez 所说,转换导致问题)。

        感谢大家的帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-28
          • 2016-11-25
          • 1970-01-01
          • 1970-01-01
          • 2011-02-10
          • 1970-01-01
          • 2011-11-01
          • 2016-11-25
          相关资源
          最近更新 更多