我正在尝试使用包含UTF8字符串的包RSS而无济于事。 (我不想使用有效的HXT,我只是想了解我哪里错了)
在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
更新: 感谢Roman的回答,我修改了我的代码。以下是对任何可能感兴趣的人的修改。
import Codec.Binary.UTF8.String (decodeString) -- <-- added
getLinks:: String -> IO [String]
getLinks url = simpleHTTP (getRequest url) >>= getResponseBody >>= parseDoc.decodeString -- <-- modified
答案 0 :(得分:2)
simpleHTTP
可能会返回基于String
的回复这一事实有点令人困惑。实际上它们不是Unicode字符串,而是包含HTTP响应的字节字符串。没有自动解码。
因此,您需要在将http响应传递给Feed解析函数之前对其进行解码(例如,使用encoding
或utf8-string
包)。
您可能希望从Content-Type
http标头或RSS文档本身中提取源编码信息。