1

我正在尝试将包RSS与 UTF8 字符串一起使用,但无济于事。(我不想使用有效的 HXT,我只想了解我错在哪里)

在 ghci 中,当我输入“test”时,我只会得到带有“é”等字符的垃圾。

如果我从读取文件中获取字符串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
4

1 回答 1

2

simpleHTTP可能返回基于响应的事实String有点令人困惑。实际上,它们不是 Unicode 字符串,而是按原样包含 HTTP 响应的字节字符串。没有进行自动解码。

因此,您需要在将 http 响应传递给解析函数(例如,使用encodingorutf8-string包)之前对其进行解码。

您可能希望从Content-Typehttp 标头或 RSS 文档本身中提取源编码信息。

于 2012-05-13T22:31:15.583 回答