1

我有一个以<?xml version="1.0" encoding="iso-8859-2"?>. 我是这样读的:

SAXParserFactory.newInstance().newSAXParser().parse(is, handler);

其中is是 InputStream 并且handler是一些任意处理程序。然后我得到这个异常:

org.apache.harmony.xml.ExpatParser$ParseException: At line 41152, column 17: not well-formed (invalid token)

实际上,该位置有一个度数符号,包含在这样的 CDATA 中:

<![CDATA[something °]]>

使用字符集 iso-8859-2,解析器应该接受几乎任何字符,包括这个字符。情况似乎并非如此。我究竟做错了什么?

编辑

我在安卓上做这一切。

奇怪:解析器似乎完全忽略了编码属性。我将文件转换为 UTF-8,同时保留标题,现在我的程序可以毫无错误地读取它。这是为什么??

(我正在像这样制作 InputStream :new BufferedInputStream(new FileInputStream(filename)),即没有阅读器,所以这不会是错误。)

4

1 回答 1

0

我通过手动识别编码来解决该错误。我查看了 XML 标头并查找了encoding属性(如果可用),提取为字符串,从中创建了一个 JavaCharset对象Charset.forName(),然后使用给定的编码创建了一个 Reader,并在该 Reader 上创建了一个 InputSource,如下所示:

String encoding;
Charset charset;
[...]
    Reader reader = new BufferedReader(new InputStreamReader(inputStream, charset));
    InputSource inputSource = new InputSource(reader);
    inputSource.setEncoding(encoding);
    SAXParserFactory.newInstance().newSAXParser().parse(inputSource, myHandler);

不幸的是,我仍然不知道为什么解析器无法自动识别编码。

于 2013-03-27T10:39:15.677 回答