SAXException iso-8859-2

Posted

技术标签:

【中文标题】SAXException iso-8859-2【英文标题】: 【发布时间】:2013-03-18 15:45:36 【问题描述】:

我有一个以<?xml version="1.0" encoding="iso-8859-2"?> 开头的 XML 文件。我是这样读的:

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,解析器应该接受几乎任何字符,包括这个字符。情况似乎并非如此。我做错了什么?

编辑

我在 android 上做这一切。

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

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

【问题讨论】:

您确定数据实际上正确编码为 ISO-8859-2 吗? 根据Wikipedia,此字符在 ISO-8859-2 中编码为 B0。那是文件中那个位置的实际字节吗? 是的,我用 Notepad++ 打开它,上面写着“ANSI 编码”,而且我有一个匈牙利 Windows,所以我确定。 确保° 在十六进制编辑器中被编码为字节b0 不知道这里是不是这样,但是java解析器通常使用指定的编码,或者如果没有指定系统默认编码,而不是文件中声明的编码 【参考方案1】:

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

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);

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

【讨论】:

以上是关于SAXException iso-8859-2的主要内容,如果未能解决你的问题,请参考以下文章

Axis解析webservice异常 SAXException SimpleDeserializer encountered a child element

SAXException iso-8859-2

org.xml.sax.SAXException:javax.xml.parsers.FactoryConfigurationError:无法创建类 javax.xml.parsers.SAXPars

启动 OSGi 模块 httpclient-osgi-4.5.3.jar 时出现 Liferay SAXException

——WebApp

Java操作XML文件