2013-03-18 3 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 °]]> 

Использование кодировки изо-8859-2, то анализатор должен принять почти любой символ, включая этот. Кажется, это не так. Что я делаю не так?

EDIT

Я делаю все это на Android.

Странно: кажется, что парсер полностью игнорирует атрибут кодирования. Я преобразовал файл в UTF-8, оставив заголовок как есть, и теперь моя программа может прочитать его без ошибок. Почему это??

(я делает InputStream как это:. new BufferedInputStream(new FileInputStream(filename)), т.е. без считывателя, так что не может быть ошибка)

+3

Вы действительно уверены, что данные действительно закодированы как ISO-8859-2? –

+0

Согласно [Wikipedia] (https://en.wikipedia.org/wiki/ISO/IEC_8859-2) этот символ кодируется как B0 в ISO-8859-2. Это фактический байт в этой позиции в файле? –

+0

Да, я открыл его в Notepad ++, он говорит «ANSI-кодировка», и у меня есть венгерская Windows, поэтому я уверен. – szali

ответ

0

Я работал вокруг ошибки путем распознавания кодировки вручную. Я заглянул в заголовок XML и искал атрибут encoding (если он доступен), извлеченный как String, создал из него объект Java CharsetCharset.forName(), затем сделал 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); 

К сожалению, я до сих пор не знаю, почему кодировка не может быть распознана автоматически парсером.