Проблем с charset и rome (rss/atom feeds)

Опитвам се да създам агрегатор на емисии, използвайки rome (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)
Secretário de São Paulo (ISO-8859-1)

Защо? Изпускам ли нещо?

Ако се опитам да използвам нещо като UTF-16, rome извежда грешка: com.sun.syndication.io.ParsingFeedException: Невалиден XML: Грешка на ред 1: Съдържанието не е разрешено в пролога.

Опитах други кодировки, като US-ASCII, без късмет...

Друг въпрос: Рим ли е най-доброто решение за работа с емисии (с помощта на java)? Най-новата версия от Рим е 1.0, която е от 2009 г. Изглежда, че е мъртва...

TIA,

Боб


person Bob Rivers    schedule 19.03.2011    source източник
comment
Това е свързано с stackoverflow.com/questions/8473410/. Във въпроса вече няма съдържание във емисията, така че не успях да тествам дали се дължи на проблем с подреждането на байтовете.   -  person Mark Butler    schedule 28.01.2013


Отговори (1)


Не знам рим (можехте да поставите връзка във въпроса си). ISO-8859-1 трябва да е правилното кодиране, което да използвате за емисията, която сте свързали. Но вашата библиотека не поддържа ли InputStream като източник (така че сама ще търси правилното кодиране от преамбюла на XML)?

Възможно ли е изходът да е изкривен, след като се обработва от изхода на вашата програма? Може ли да напишете

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

във вашата програма и докладвайте нейния резултат? (Трябва да е „Сао Пауло“, ако комбинацията ви Java + конзола е конфигурирана правилно.)


И така, сега изтеглих и компилирах Рим (което отне половин час изтегляне на други неща от 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 (който изглежда е този, използван тук), но не намерих нищо подозрително, което да причини това.

person Paŭlo Ebermann    schedule 20.03.2011
comment
Благодаря за вашият отговор. Предоставих връзката към проекта Рим. Опитах и ​​по двата начина, със и без дефиниране на кодирането за InputStream. Резултатите бяха същите (без да се уточнява, че резултатът беше същият, използвайки UTF-8). Направих теста и се получи. Отпечатано е правилно São Paulo. - person Bob Rivers; 20.03.2011
comment
Благодаря ти много. Работи добре, когато се приложи начина, по който предложихте. - person Bob Rivers; 21.03.2011
comment
@Bob: Това има другото предимство да се настройва към всякакви промени в кодирането на източника. - person Paŭlo Ebermann; 21.03.2011
comment
@PaŭloEbermann благодаря много! Сблъсках се с този проблем, използвайки разширението ROME на библиотеката на Restlet (ще изпратя предложение за корекция на хората от Restlet). Ти ми спести много време. - person Andy Dennie; 09.03.2012