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
org.xml.sax.SAXException:javax.xml.parsers.FactoryConfigurationError:无法创建类 javax.xml.parsers.SAXPars
启动 OSGi 模块 httpclient-osgi-4.5.3.jar 时出现 Liferay SAXException