我有一个以<?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[something °]]>使用字符集iso-8859-2,解析器应该接受几乎任何字符,包括这个字符。情况似乎并非如此。我做错了什么?
编辑
这一切我都是用Android做的。
怪异:解析器似乎完全忽略了编码属性。我将文件转换为UTF-8,同时保持原样,现在我的程序可以毫无错误地读取它。那是为什么?
(我将InputStream设置为:new BufferedInputStream(new FileInputStream(filename)),即没有读取器,所以不可能是错误。)
发布于 2013-03-27 10:39:15
我通过手动识别编码来解决错误。我查看了XML,查找了encoding属性(如果可用的话),该属性提取为字符串,由Charset.forName()从它创建了一个Java Charset对象,然后使用给定的编码和在该阅读器上创建了一个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);不幸的是,我仍然不知道为什么解析器不能自动识别编码。
https://stackoverflow.com/questions/15480966
复制相似问题