4

ローマ(1.0)を使用してフィード アグリゲーターを作成しようとしています。すべてが機能していますが、フィードの文字セットに問題があります。Mac OS X(netbeans 6.9.1)でJava 1.6を使用して開発しています。

次のコードを使用してフィードを取得しています。

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

はRSS_sourceソース ( http://rss.cnn.com/rss/edition.rss など)であり、UTF-8 または ISO-8859-1 です。_charset

それは機能しますが、ラテン文字 (ポルトガル語など) を使用する一部のサイトでは、両方のエンコーディングを使用しても機能しません。

たとえば、http://oglobo.globo.com/rss/plantaopais.xmlから読み込まれたフィードは、常に次のようなダミー文字を返します。

サンパウロの秘密(UTF-8)
サンパウロの秘密(ISO-8859-1)

なんで?何か不足していますか?

UTF-16 などを使用しようとすると、ローマからエラーがスローされます: com.sun.syndication.io.ParsingFeedException: Invalid XML: Error on line 1: Content is not allowed in prolog.

US-ASCII のような他のエンコーディングを試してみましたが、幸運ではありませんでした...

もう 1 つの質問: ローマは (Java を使用して) フィードを処理するための最良のソリューションですか? ローマの最新バージョンは 1.0 で、2009 年のものです。

ティア、

ボブ

4

1 に答える 1

7

私はローマを知りません(あなたはあなたの質問にリンクを入れることができたでしょう)。ISO-8859-1は、リンクしたフィードに使用する適切なエンコーディングである必要があります。しかし、ライブラリはソースとしてをサポートしていませんInputStream(したがって、ライブラリ自体がXMLプリアンブルによって正しいエンコーディングを検索します)。

プログラムの出力で処理した後、出力が文字化けしている可能性がありますか?書いていただけませんか

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

あなたのプログラムでその出力を報告しますか?(Javaとコンソールの組み合わせが正しく構成されている場合は「サンパウロ」になります。)


それで、私は今ローマをダウンロードしてコンパイルしました(Mavenによる他のもののダウンロードに30分かかりました)、そして私は問題を再現することができます。buildリーダーを使用する方法に問題があるようです。

動作するバリアントは次のとおりです(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());
    }


}

InputSourceInputStream代わりにを使用することによりReader、パーサー自体が適切な文字セットを見つけて、適切に取得します。


ソースを少し掘り下げてみると、SyndFeedはReaderまたはInputSourceをJDOMに渡し、JDOMはそれをSAX XMLReaderに渡しているようです。これは、で表示されるReaderに直面すると混乱するよう<?xml ... encoding="ISO-8859-1" ?>です。次に、Xercesのソース(ここで使用されているようです)を調べましたが、これを引き起こす疑わしいものは見つかりませんでした。

于 2011-03-20T03:48:18.617 に答える