我有一个以<?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 °]]>
使用charset iso-8859-2,解析器应该接受几乎任何字符,包括这个字符。事实似乎并非如此。我做错了什么?
修改
我在Android上做这一切。
很奇怪:似乎解析器完全忽略了编码属性。我将文件转换为UTF-8,同时保留标题,现在我的程序可以正确读取它。为什么???
(我正在制作像这样的InputStream:new BufferedInputStream(new FileInputStream(filename))
,即没有读者,所以这不是错误。)
答案 0 :(得分:0)
我通过手动识别编码来解决错误。我查看了XML标头并查找了encoding
属性(如果可用),作为String提取,由Charset
从中创建了一个Java Charset.forName()
对象,然后创建了一个给定的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);
不幸的是,我仍然不知道为什么解析器无法自动识别编码。