3

My application will read xml from urlconnection. The xml encoding is ISO-8859-1, it contains é character. I use xerces saxparser to parse received xml content. However, é can not be parsed correctly while running application under lunix OS. Everything works fine in Windows. Could you guys please give me some hints? Thanks a lot

4

5 回答 5

2

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

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

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

于 2008-11-16T12:25:24.000 回答
1

I bet this is related to file.encoding. Try running with -Dfile.encoding=iso-8859-1 as a VM parameter on linux.

If this works, you probably need to specify the correct format when opening the stream (somewhere in your code).

于 2008-11-16T09:47:56.033 回答
1

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

您可以先使用 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 编码。

于 2008-11-16T12:57:21.000 回答
0

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

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

InputSource inputSource = new InputSource(xmlInputStream);
inputSource.setEncoding("ISO-8859-1");
于 2008-11-19T20:24:05.873 回答
0

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

感谢大家的帮助。

于 2008-12-03T15:31:42.807 回答