0
在SO人的帮助下,我成功实现了simple rss downloader in haskell。 但有一个问题仍然存在:如何修复Feed项目标题的破碎编码? 这里是最小的工作示例:修复haskell中的utf8编码破解
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/"),...]
我做了一些研究,进给其项目名称由<![CDATA[]]
sorrounded,所以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编码这个字符串?
我不确定我是否理解这个问题。你不喜欢这里有什么行为? UTF-8与它有什么关系?如果它按照你想要的方式行事,它会有什么不同? – shachaf
@shachaf:t \ 246megk \ 246zleked \ 233s - >tömegközlekedés等等...... – pasja
好的。 1:Haskell'String's是Unicode字符串。它们不是UTF-8或UTF,它们只是Unicode代码点的列表。 2:你只是在查看'show'的结果作为一个字符串。这就是'Show'实例的工作方式 - 你无法对此做任何事情。如果您打印字符串 - 例如用'putStrLn' - 你会发现它打印的很好。字符串是正确的,只是你看着它的方式逃脱了一些字符。 – shachaf