4

我正在尝试使用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)));

_sourcerss 源(如http://rss.cnn.com/rss/edition.rss)在哪里,_charset是 UTF-8 或 ISO-8859-1。

它可以工作,但是即使我同时使用两种编码,某些带有拉丁字符(如葡萄牙语)的网站也无法使用。

例如,从http://oglobo.globo.com/rss/plantaopais.xml读取的提要将始终返回虚拟字符,如下所示:

圣保罗秘密(UTF-8)
圣保罗秘密(ISO-8859-1)

为什么?我错过了什么吗?

如果我尝试使用 UTF-16 之类的东西,rome 会抛出错误:com.sun.syndication.io.ParsingFeedException: Invalid XML: Error on line 1: Content is not allowed in prolog。

我尝试过其他编码,比如没有幸运的 US-ASCII...

另一个问题:罗马是处理提要(使用 java)的最佳解决方案吗?来自罗马的最新版本是 2009 年的 1.0。似乎已经死了......

TIA,

鲍勃

4

1 回答 1

7

我不知道罗马(你可以在你的问题中加入一个链接)。ISO-8859-1 应该是用于您链接的提要的正确编码。但是您的库不支持InputStream作为源(因此它本身会通过 XML 前导码查找正确的编码)吗?

会不会是你的程序输出处理后输出乱码?你能写吗

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

在您的程序中并报告其输出?(如果您的 Java + 控制台组合配置正确,则应该是“São Paulo”。)


所以,我现在下载并编译了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());
    }


}

通过使用 anInputSourceInputStream不是 a Reader,解析器本身会找出正确的字符集,并使其正确。


在源代码中挖掘了一下,似乎我们的 SyndFeed 将 Reader 或 InputSource 传递给了 JDOM,JDOM 又将它传递给了 SAX XMLReader,如果面对一个显示为<?xml ... encoding="ISO-8859-1" ?>. 然后我在 Xerces 的源头(似乎是这里使用的那个)中进行了挖掘,但没有发现任何可能导致这种情况的可疑之处。

于 2011-03-20T03:48:18.617 回答