charset和rome(rss/atom feed)的问题

Bob*_*ers 4 java feed character-encoding rome

我正在尝试使用rome(1.0)创建一个feed聚合器.一切正常,但我遇到饲料字符集的问题.我正在使用java 1.6在mac os x(netbeans 6.9.1)上开发它.

我正在使用以下代码来检索Feed:

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

_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这样的东西,罗马会抛出一个错误:com.sun.syndication.io.ParsingFeedException:无效的XML:第1行的错误:prolog中不允许使用内容.

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

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

TIA,

短发

Paŭ*_*ann 7

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

可能是在程序输出处理之后输出会出现乱码吗?你能写吗?

System.out.println("S\u00e3o Paulo");
Run Code Online (Sandbox Code Playgroud)

在你的程序中并报告其输出?(如果您的Java +控制台组合配置正确,它应该是"圣保罗".)


所以,我现在下载并编译了罗马(由Maven下载其他东西花了半个小时),我可以重现这个问题.看起来像build读取器的方法有问题.

这是一个有效的变体(如果罗马,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());
    }


}
Run Code Online (Sandbox Code Playgroud)

通过使用InputSourcewith InputStream而不是a Reader,解析器本身找到正确的字符集,并使其正确.


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