【发布时间】:2008-11-16 09:40:39
【问题描述】:
我的应用程序将从 urlconnection 读取 xml。 xml 编码是 ISO-8859-1,它包含 é 字符。我使用 xerces saxparser 来解析收到的 xml 内容。但是,在 lunix OS 下运行应用程序时无法正确解析 é。在 Windows 中一切正常。你们能给我一些提示吗?非常感谢
【问题讨论】:
标签: java linux xerces saxparser
我的应用程序将从 urlconnection 读取 xml。 xml 编码是 ISO-8859-1,它包含 é 字符。我使用 xerces saxparser 来解析收到的 xml 内容。但是,在 lunix OS 下运行应用程序时无法正确解析 é。在 Windows 中一切正常。你们能给我一些提示吗?非常感谢
【问题讨论】:
标签: java linux xerces saxparser
这可能是一个标记为“ISO-8859-1”的文件,而实际上它是另一种编码。
“ISO-8859-1”和“Windows-2152”通常会发生这种情况:它们被使用时就好像它们可以互换一样,但事实并非如此。 (在此答案的 cmets 中,已澄清两种编码都同意“é”的字符代码,因此可能不是 Windows-1252。)
您可以使用十六进制编辑器找出文件中“é”的确切字符代码。您可以将该值作为文件编码方式的提示。如果您可以控制文件的生成方式,则建议查看负责的代码/方法。
【讨论】:
我敢打赌这与 file.encoding 有关。尝试在 Linux 上使用 -Dfile.encoding=iso-8859-1 作为 VM 参数运行。
如果可行,您可能需要在打开流时(在代码中的某个位置)指定正确的格式。
【讨论】:
您应该做的第一件事是确定 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 编码。
【讨论】:
如果 XML 声明未指定编码,则 sax 解析器将尝试使用默认编码 UTF-8。
如果您知道字符编码但未在 XML 声明中指定,您可以告诉解析器将该编码与 InputSource 一起使用:
InputSource inputSource = new InputSource(xmlInputStream);
inputSource.setEncoding("ISO-8859-1");
【讨论】:
对不起,我的回复晚了。我们解决了这个问题。我们对输入流做了一些错误的操作(正如 Fernando Miguélez 所说,转换导致问题)。
感谢大家的帮助。
【讨论】: