Проблема с кодировкой и Римом (каналы rss / atom) - PullRequest
4 голосов
/ 20 марта 2011

Я пытаюсь создать агрегатор каналов, используя Рим (1.0). Все работает, но у меня проблемы с кодировкой канала. Я разрабатываю его, используя Java 1.6 поверх Mac OS X (NetBeans 6.9.1).

Я использую следующий код для получения каналов:

InputStream is = new URL(_source).openConnection().getInputStream();
SyndFeed feed = (SyndFeed) input.build(new InputStreamReader(is, Charset.forName(_charset)));

Где _source - это источник rss (например, http://rss.cnn.com/rss/edition.rss) и _charset - это UTF-8 или ISO-8859-1.

Это работает, но на некоторых сайтах с латинскими буквами (например, на португальском) - нет, даже если я использую обе кодировки.

Например, каналы, считанные из http://oglobo.globo.com/rss/plantaopais.xml, всегда будут возвращать фиктивные символы в следующем виде:

Secret rio de S o Paulo (UTF-8)
Секретарь Сан-Паулу (ISO-8859-1)

Почему? Я что-то упустил?

Если я пытаюсь использовать что-то вроде UTF-16, Рим выдает ошибку: com.sun.syndication.io.ParsingFeedException: неверный XML: ошибка в строке 1: содержимое не разрешено в прологе.

Я пробовал другие кодировки, такие как US-ASCII, но не повезло ...

Другой вопрос: является ли Рим лучшим решением для работы с фидами (с использованием Java)? Самая последняя версия из Рима - 1.0, выпущенная в 2009 году. Кажется, она мертва ...

ТИА

Боб

1 Ответ

7 голосов
/ 20 марта 2011

Я не знаю Рим (вы могли бы поставить ссылку в своем вопросе).ИСО-8859-1 должна быть правильной кодировкой, чтобы использовать для канала, который вы связали.Но разве ваша библиотека не поддерживает InputStream в качестве источника (поэтому она сама будет искать правильную кодировку в преамбуле XML)?

Может ли быть, что вывод искажен после его обработки выводомвашей программы?Не могли бы вы написать

System.out.println("S\u00e3o Paulo");

в вашей программе и сообщить о ее выводе?(Это должно быть "Сан-Паулу", если ваша комбинация Java + консоль настроена правильно.)


Итак, я сейчас скачал и скомпилировал Rome (что потребовало полчаса загрузки других вещей Maven)и я могу воспроизвести проблему.Похоже, что метод build, принимающий Reader, имеет проблемы.

Вот вариант, который работает (если rome, jdom и xerces находятся в пути к классам):

package de.fencing_game.paul.examples.rome;

import org.xml.sax.InputSource;

import java.nio.charset.Charset;
import java.io.*;
import java.net.*;

import com.sun.syndication.io.*;
import com.sun.syndication.feed.synd.*;

public class RomeTest {

    public static void main(String[] ignored)
        throws IOException, FeedException
    {
        String charset = "UTF-8";
        String url = "http://oglobo.globo.com/rss/plantaopais.xml";


        InputStream is = new URL(url).openConnection().getInputStream();
        InputSource source = new InputSource(is);

        SyndFeedInput input = new SyndFeedInput();
        SyndFeed feed = input.build(source);

        System.out.println("description: " + feed.getDescription());
    }


}

ИспользуяInputSource с InputStream вместо Reader, синтаксический анализатор сам находит правильную кодировку и получает ее правильно.


Покопавшись в источнике, кажется, нашSyndFeed передает Reader или InputSource в JDOM, который, в свою очередь, передает их SAX XMLReader, который, кажется, запутывается, если сталкивается с Reader, который представляет собой <?xml ... encoding="ISO-8859-1" ?>.Затем я покопался в источнике Xerces (который, похоже, использовался здесь), но не нашел ничего подозрительного, что могло бы вызвать это.

...