2013-03-18 64 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); 

不幸的是,我仍然不知道爲什麼解析器無法自動識別編碼。

相關問題