Кодировка синтаксического анализатора в Java - PullRequest
1 голос
/ 27 марта 2012

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

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

enter image description here

Ответы [ 3 ]

2 голосов
/ 27 марта 2012

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

1 голос
/ 04 сентября 2012

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

InputSource is = new InputSource(responseStream)

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

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

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

0 голосов
/ 27 марта 2012

Наконец, я решил свою проблему, используя Римскую библиотеку .Хорошо работает также с 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());
    }
} 
...