2011-03-19 47 views
4

我試圖用rome(1.0)創建一個feed聚合器。一切正常,但我正面臨Feed的字符集問題。我使用java 1.6在mac os x(netbeans 6.9.1)上開發它。字符集和羅馬問題(rss/atom feed)

我用下面的代碼來檢索提要:

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將總是返回空字符如下:

Secretrio德聖保羅(UTF-8)
Secretário代薩£聖保羅( ISO-8859-1)

爲什麼?我錯過了什麼嗎?

如果我嘗試使用類似UTF-16的東西,羅馬會拋出一個錯誤:com.sun.syndication.io.ParsingFeedException:無效的XML:第1行錯誤:內容不允許在prolog中使用。

我試過其他編碼,如US-ASCII不走運......

另一個問題是:羅馬對付飼料(用java)的最佳解決方案?從羅馬最新的版本是1.0是從2009年日好像是死了......

TIA,

鮑勃

+0

這與http://stackoverflow.com/questions/8473410/while-parsing-rss-feed-through-rome-getting-content-is-not-allowed-in-prolog/14557915#14557915有關。問題中的內容不再有內容,所以我無法測試它是否由於字節排序問題。 – 2013-01-28 08:12:29

回答

6

我不知道羅馬(你可能已經把鏈接在你的問題)。 ISO-8859-1應該是正確的編碼,用於鏈接的Feed。但是,您的庫不支持將InputStream作爲源(因此它本身會通過XML序言查找正確的編碼)?

難道是它的輸出在你的程序輸出處理後出現亂碼?你能寫

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

在你的程序中,並報告其輸出? (它應該是「聖保羅」如果您的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()); 
    } 


} 

通過使用與InputStream代替ReaderInputSource,解析器本身找出正確的字符集,並得到它的權利。


源周圍挖了一下,似乎我們SyndFeed經過Reader或的InputSource JDOM,這反過來把它傳遞給SAX的XMLReader,這似乎感到困惑,如果遇到與呈現本身就是一個閱讀器與<?xml ... encoding="ISO-8859-1" ?>。然後我在Xerces的來源(這似乎是這裏使用的)中挖掘出來的,但是沒有發現任何可能導致這種情況的可疑信息。

+0

感謝您的回答。我提供了羅馬項目的鏈接。我嘗試了兩種方法,有和沒有定義InputStream的編碼。結果是一樣的(沒有指定使用UTF-8的結果相同)。我做了測試,它的工作。它正確地印刷了聖保羅。 – 2011-03-20 19:12:00

+0

非常感謝。按照您的建議實施時,它很好地工作。 – 2011-03-21 01:00:06

+0

@Bob:這有另一個好處,可以自己調整來源編碼的任何更改。 – 2011-03-21 01:07:02