SAXException iso-8859-2

У меня есть файл XML, который начинается с <?xml version="1.0" encoding="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.

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

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

1 ответ

Решение

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

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

Другие вопросы по тегам