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
5 回答
这可能是一个标记为“ISO-8859-1”的文件,而实际上它是另一种编码。
通常这种情况发生在“ISO-8859-1”和“Windows-2152”中:它们被使用得好像它们是可互换的,但它们不是。(在对这个答案的评论中已经澄清,两种编码都同意“é”的字符代码,所以 Windows-1252 可能不是。)
您可以使用十六进制编辑器找出文件中“é”的确切字符代码。您可以将该值作为文件编码的提示。如果您可以控制文件的生成方式,则建议查看负责的代码/方法。
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).
正如 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 编码。
如果 XML 声明未指定编码,则 sax 解析器将尝试使用默认编码 UTF-8。
如果您知道字符编码但未在 XML 声明中指定,则可以告诉解析器将该编码与 InputSource 一起使用:
InputSource inputSource = new InputSource(xmlInputStream);
inputSource.setEncoding("ISO-8859-1");
抱歉这么晚才回复。我们解决了这个问题。我们对输入流做了一些错误的操作(正如 Fernando Miguélez 所说,转换导致了问题)。
感谢大家的帮助。