é未正确解析

时间:2008-11-16 09:40:40

标签: java linux xerces saxparser

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

5 个答案:

答案 0 :(得分:2)

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

这通常发生在“ISO-8859-1”和“Windows-2152”中:它们被用作好像它们可以互换,但它们不是。 (在对这个答案的评论中,已经澄清两个编码都同意“é”的字符代码,因此Windows-1252可能不是它。)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

你应该做的第一件事是确定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编码。

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

很抱歉我迟到的回复。我们解决了这个问题。我们对输入流做了一些错误的操作(正如FernandoMiguélez所说,转换导致了问题)。

感谢你们所有人的帮助。