Кодировка синтаксического анализатора в Java

1

У меня проблема с саксовым парсером и закодированным текстом. Я пытаюсь разобрать 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);

но парсер возвращает строки со странными символами. Я много пробовал, но мне ничего не помогло :( Может кто-нибудь мне помочь?

Изображение 174551

  • 0
    Попробуйте это с UTF-8, это как минимум то, что мой браузер говорит о кодировке. Или вам может понадобиться прочитать кодировку из заголовка ответа, если он присутствует. Вы также можете установить кодировку в InputStreamReader, возможно, она должна быть в обоих
  • 0
    Я пробовал UTF-8, но он по-прежнему возвращает странные символы. Я также попытался установить кодировку в InputStreamReader безрезультатно. Заголовок ответа: HTTP / 1.1 200 OK. Дата: понедельник, 26 марта 2012 20:19:21 GMT. Сервер: Apache. Вариант: Accept-Encoding. Тип содержимого: application / rss + xml. Transfer-Encoding: chunked.
Теги:
xml-parsing
encoding
rss

3 ответа

2
Лучший ответ

Пробовали ли вы установить кодировку 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.

  • 0
    Эта причина кода: ParseException: В строке 1, столбец 0: неправильно сформирован (неверный токен).
  • 0
    Имеет ли файл XMl действительный заголовок xml: <? Xml version = "1.0" encoding = "ISO-8859-2"?>
1

Sax способен автоматически определять кодировку, если она задает входной поток, а не читатель.

InputSource is = new InputSource(responseStream)

Вероятно, в вашем случае вам нужна жестко закодированная кодировка, и вы получили ответ о том, как это сделать. Но я искал общее решение и нашел его здесь: Как разрешить SAX-синтаксический анализатор определить кодировку из объявления xml?

Документация: InputSource в java 5 (обратите внимание, что в документации java 1.4 отсутствует ключевое предложение). автообнаружение кодировки символов с использованием алгоритма, такого как тот, который указан в спецификации XML. Это относится к потоку байтов, но не к потоку символов (Reader)

Поскольку я больше разбирался в документации XML (Autodetection of Character Encodings), я нашел объяснение разницы между обработкой Reader и Stream. Чтобы применить все алгоритмы кодирования, Sax должен иметь доступ к необработанному потоку, а не преобразован в символы, поскольку преобразование может привести к повреждению байтовых маркеров.

0

Наконец, я решил проблему с помощью библиотеки Рима. Он хорошо работает и с 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());
    }
} 
  • 0
    новый InputStreamReader (есть Charset.forName ("ISO-8859-2")) - так много, что я сказал?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню