有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

charset和rome的java问题(rss/atom提要)

我正在尝试使用rome(1.0)创建一个提要聚合器。一切正常,但我面临feed的字符集问题。我正在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)));

其中_source是rss源(如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。太阳辛迪加。伊奥。ParsingFeedException:第1行的XML:错误无效:prolog中不允许包含内容

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

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

蒂娅

鲍勃


共 (1) 个答案

  1. # 1 楼答案

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

    是不是在你的程序的输出进行处理后,输出被篡改了?你能写信吗

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

    并报告其输出?(如果Java+控制台组合配置正确,则应该是“圣保罗”。)


    所以,我现在下载并编译了Rome(Maven花了半个小时下载了其他东西),我可以重现这个问题。看起来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());
        }
    
    
    }
    

    通过使用带有InputStream而不是ReaderInputSource,解析器本身会找到正确的字符集,并使其正确


    在源代码中翻一翻,我们的SyndFeed似乎将读取器或InputSource传递给JDOM,JDOM又将其传递给SAX XMLReader,如果遇到一个以^{呈现的读取器,它似乎会感到困惑。然后我翻遍了Xerces的来源(似乎就是这里使用的那个),但没有发现任何可疑的原因