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);
К сожалению, я до сих пор не знаю, почему парсер не может автоматически распознать кодировку.