2012-05-11 168 views
1

我試圖用UTF8字符串使用包RSS,但沒有效果。 (我不想使用HXT的工程,我只想了解我的錯在哪裏)如何獲取utf8 rss feed?

在ghci當我把「測試」我只是得到垃圾與字符,如「é」。

如果我從UTF8.readFile讀取文件中的字符串並將其發送到parseFromString它可以工作,但是當我下載並使用getRespBody時,它不會。

這裏是我的示例代碼:

import Network.HTTP     (simpleHTTP, getRequest, getResponseBody) 
import Data.Maybe (fromJust) 
import Text.Feed.Import (parseFeedString) 
import Text.RSS.Syntax 
import Text.Feed.Types (Feed(..)) 
import Prelude hiding (putStrLn) 
import Data.ByteString.Char8 (putStrLn) 
import Data.ByteString.UTF8 (fromString) 

siteUrl = "http://radiofrance-podcast.net/podcast09/rss_11549.xml" 

type Links = [(String,String,String)] 


------------------------------------------------------------------------------- 
-- Main function 
------------------------------------------------------------------------------- 

test = getLinks siteUrl >>= mapM_ (putStrLn.fromString) 

------------------------------------------------------------------------------- 
--  Retrieve titles 
------------------------------------------------------------------------------- 

getLinks:: String -> IO [String] 
getLinks url = simpleHTTP (getRequest url) >>= getResponseBody >>= parseDoc 


parseDoc d = do 
let RSSFeed rss = (fromJust . parseFeedString) d 
    items = rssItems.rssChannel $ rss 
    titles = map (fromJust.rssItemTitle) items 
return $ titles 

更新: 感謝羅馬的回答,我已經修改了我的代碼。以下是對可能感興趣的任何人的修改。

import Codec.Binary.UTF8.String  (decodeString) -- <-- added 

getLinks:: String -> IO [String] 
getLinks url = simpleHTTP (getRequest url) >>= getResponseBody >>= parseDoc.decodeString -- <-- modified 

回答

1

simpleHTTP可能返回String基於響應的事實是有點混亂。實際上,它們不是Unicode字符串,而是包含HTTP響應的字節字符串。沒有自動解碼完成。

因此,在將它傳遞給提要解析函數(例如,使用encodingutf8-string包)之前,您需要解碼http響應。

您可能想要從Content-Type http標頭或RSS文檔本身提取源編碼信息。

+0

謝謝,我重讀了utf8-string包和函數'decode'製作的竅門。我將更新代碼以共享解決方案。 –