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 

更新:Romanの回答のおかげで、コードを変更しました。興味があるかもしれない人のための修正はここにあります。

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 応答をデコードする必要があります (たとえば、encodingまたはutf8-stringパッケージを使用)。

おそらく、Content-Typehttp ヘッダーまたは RSS ドキュメント自体からソース エンコーディング情報を抽出する必要があります。

于 2012-05-13T22:31:15.583 に答える