簡體   English   中英

修復haskell中損壞的utf8編碼

[英]fix broken utf8 encoding in haskell

在善良的SO人員的幫助下,我成功地在haskell中實現了一個簡單的rss下載器 但是仍然存在一個問題:如何解決供稿商品標題的編碼錯誤? 這是最小的工作示例:

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[]]包圍,因此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編碼到此字符串?

好的,我只在這里復制我的評論:

  1. Haskell字符串是Unicode字符串。 它們不是UTF-8或其他任何UTF,它們只是Unicode代碼點的列表。

  2. 您只是在查看show字符串的結果。 這就是Show實例的工作方式-您將無法對此做任何事情。 如果您打印字符串(例如,使用putStrLn ,您會發現它可以正常打印。 字符串是正確的,只是您查看字符串的方式會轉義一些字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM