2013-03-18 29 views
1

我有一个XML文件,以<?xml version="1.0" encoding="iso-8859-2"?>开头。我读了下面的方法:SAXException 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,解析器应接受几乎任何角色,包括这一个。这似乎并非如此。我究竟做错了什么?

编辑

我做的这一切都在Android上。

奇怪:看起来解析器完全忽略了encoding属性。我将文件转换为UTF-8,同时保留标题,现在我的程序可以正确读取它。这是为什么??

(我正在InputStream的是这样的:new BufferedInputStream(new FileInputStream(filename)),即没有一个阅读器,使得不能错误)

+3

您确定数据*实际上*正确编码为ISO-8859-2吗? – 2013-03-18 15:46:32

+0

根据[Wikipedia](https://en.wikipedia.org/wiki/ISO/IEC_8859-2),该字符在ISO-8859-2中被编码为B0。这是文件中该位置的实际字节吗? – 2013-03-18 15:54:04

+0

是的,我在Notepad ++中打开它,它说“ANSI编码”,我有一个匈牙利语Windows,所以我敢肯定。 – szali 2013-03-18 15:54:10

回答

0

我工作围绕误差通过手动识别的编码。我偷看了XML标题,并查找了encoding属性(如果可用),提取为字符串,通过Charset.forName()创建了一个Java Charset对象,然后使用给定的编码和该Reader的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); 

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

相关问题