0

在好心人的帮助下,我成功地在 haskell 中实现了一个简单的 rss 下载器。但是还有一个问题:如何修复 Feed 项标题的损坏编码?这是最小的工作示例:

import Control.Monad
import Control.Applicative
import Network.HTTP
import Text.Feed.Import
import Text.Feed.Query
import Text.Feed.Types
import Data.Maybe
import qualified Data.ByteString as B
import Network.URI (parseURI, uriToString)
import Codec.Binary.UTF8.String (decodeString, encodeString)

getTitleAndUrl :: Item -> (Maybe String, Maybe String)
getTitleAndUrl item = (getItemTitle item, getItemLink item)

downloadUri :: (Maybe String,Maybe String) -> IO ()
downloadUri (Just title,Just link) = do
  item <- get link
  B.writeFile title item
    where
      get url = let uri = case parseURI url of
                      Nothing -> error $ "invalid uri" ++ url
                      Just u -> u in
                simpleHTTP (defaultGETRequest_ uri) >>= getResponseBody
downloadUri _ = print "Somewhere something went Nothing"

getTuples :: IO (Maybe [(Maybe String, Maybe String)])
getTuples = fmap (map getTitleAndUrl) <$> fmap (feedItems) <$> parseFeedString <$> decodeString <$> (simpleHTTP (getRequest "http://index.hu/24ora/rss/") >>= getResponseBody)

main = getTuples

它打印出来像

Just [...,(Just "Gyalogosbaleset miatt \225ll a t\246megk\246zleked\233s a Margit h\237don",Just "http://velvet.hu/blogok/helyszinelo/2013/06/18/gyalogossbaleset_miatt_all_a_tomegkozlekedes_a_margit_hidon/"),...]

我做了一些研究,提要的项目标题由 sorrounded 包围<![CDATA[]],因此 xml 解析器会跳过它们。

示例项目:

<item>
        <title><![CDATA[Gyalogosbaleset miatt áll a tömegközlekedés a Margit hídon]]></title>
        <link>http://velvet.hu/blogok/helyszinelo/2013/06/18/gyalogossbaleset_miatt_all_a_tomegkozlekedes_a_margit_hidon/</link>
        <pubDate>Tue, 18 Jun 2013 09:08:00 +0200</pubDate>
        <category domain="main"></category>
        <description><![CDATA[A tájékoztatás szerint a budai hídfő megállójában elesett egy gyalogos, jelenleg pótlóbuszok közlekednek.]]></description>
        <content:encoded><![CDATA[A tájékoztatás szerint a budai hídfő megállójában elesett egy gyalogos, jelenleg pótlóbuszok közlekednek.]]></content:encoded>
</item>

我如何强制对这个字符串进行 utf8 编码?

4

1 回答 1

8

好的,我将在这里复制我的评论:

  1. Haskell 字符串是 Unicode 字符串。它们不是 UTF-8 或 UTF-anything——它们只是 Unicode 代码点列表。

  2. 您只是在查看show字符串的结果。这就是Show实例的工作方式——您将无法对此做任何事情。如果你打印字符串——例如用putStrLn——你会看到它打印得很好。该字符串是正确的,只是您查看它的方式转义了一些字符。

于 2013-06-18T08:53:44.197 回答