2013-06-18 3 views
0

С помощью добрых людей SO я успешно реализовал simple rss downloader in haskell. Но остается один вопрос: как исправить разбитую кодировку заголовка фида? Вот минимальный рабочий пример:Исправить сломанную кодировку utf8 в haskell

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 для этой строки?

+0

Я не уверен, что понял вопрос. Какое поведение здесь вам не нравится? Что делает UTF-8? Как бы он поступил иначе, если бы он вел себя так, как вы хотите? – shachaf

+0

@shachaf: t \ 246megk \ 246zleked \ 233s -> tömegközlekedés и т. Д. – pasja

+1

OK. 1: Haskell 'String' являются строками Unicode. Они не UTF-8 или UTF-ничего - они просто списки кодов Unicode. 2: Вы просто смотрите на результат 'show' для строки. Вот как работает экземпляр «Show» - вы не сможете ничего с этим поделать. Если вы печатаете строку - например, с 'putStrLn' - вы увидите, что он отлично печатается. Строка правильная, просто так, как вы смотрите на нее, это ускользает от некоторых символов. – shachaf

ответ

7

Хорошо, я просто скопировать мой комментарий здесь:

  1. Haskell Строки Unicode строки. Они не UTF-8 или UTF-ничего - они просто списки кодов Unicode.

  2. Вы просто смотрите на результат show на строку. Вот как работает экземпляр Show - вы не сможете ничего с этим поделать. Если вы печатаете строку - например, с putStrLn - вы увидите, что он печатает отлично. Строка правильная, просто так, как вы смотрите на нее, это ускользает от некоторых символов.

Смежные вопросы