У меня проблема с саксовым парсером и закодированным текстом. Я пытаюсь разобрать RSS в ISO-8859-2 (http://www.sbazar.cz/rss.xml?keyword=pes) следующим образом:
InputStream responseStream = connection.getInputStream();
Response response = mRequest.createResponse();
Reader reader = new InputStreamReader(responseStream);
InputSource is = new InputSource(reader);
is.setEncoding("ISO-8859-2");
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
saxParser.parse(is, response);
но парсер возвращает строки со странными символами. Я много пробовал, но мне ничего не помогло :( Может кто-нибудь мне помочь?
Пробовали ли вы установить кодировку InputStreamReader:
Reader reader = new InputStreamReader(responseStream, Charset.forName("ISO-8859-2"));
InputSource is = new InputSource(reader);
Конструктор InputStreamReader (InputStream), если вы не укажете кодировку, использует кодировку по умолчанию (которая на моем компьютере - это windows-1252).
Таким образом, в вашей текущей настройке байты интерпретируются как (возможно) символы windows-1252, после чего я не думаю, что вы можете перефразировать их как ISO-8859-2.
Sax способен автоматически определять кодировку, если она задает входной поток, а не читатель.
InputSource is = new InputSource(responseStream)
Вероятно, в вашем случае вам нужна жестко закодированная кодировка, и вы получили ответ о том, как это сделать. Но я искал общее решение и нашел его здесь: Как разрешить SAX-синтаксический анализатор определить кодировку из объявления xml?
Документация: InputSource в java 5 (обратите внимание, что в документации java 1.4 отсутствует ключевое предложение). автообнаружение кодировки символов с использованием алгоритма, такого как тот, который указан в спецификации XML. Это относится к потоку байтов, но не к потоку символов (Reader)
Поскольку я больше разбирался в документации XML (Autodetection of Character Encodings), я нашел объяснение разницы между обработкой Reader и Stream. Чтобы применить все алгоритмы кодирования, Sax должен иметь доступ к необработанному потоку, а не преобразован в символы, поскольку преобразование может привести к повреждению байтовых маркеров.
Наконец, я решил проблему с помощью библиотеки Рима. Он хорошо работает и с ISO-8859-2. Вот исходный код, как использовать Рим:
String urlstring = "http://www.sbazar.cz/rss.xml?keyword=pes";
InputStream is = new URL(urlstring).openConnection().getInputStream();
SyndFeedInput input = new SyndFeedInput();
SyndFeed feed = (SyndFeed)input.build(new InputStreamReader(is, Charset.forName("ISO-8859-2")));
Iterator entries = feed.getEntries().iterator();
while (entries.hasNext())
{
SyndEntry entry = (SyndEntry)entries.next();
Log.d("RSS", "-------------");
Log.d("RSS", "Title: " + entry.getTitle());
Log.d("RSS", "Published: " + entry.getPublishedDate());
if (entry.getDescription() != null)
{
Log.d("RSS", "Description: " + entry.getDescription().getValue());
}
if (entry.getContents().size() > 0)
{
SyndContent content = (SyndContent)entry.getContents().get(0);
Log.d("RSS", "Content type=" + content.getType());
Log.d("RSS", "Content value=" + content.getValue());
}
}