2013-09-10 27 views
0

我試過下面的代碼來下載HTML,但它實際上會將非ASCII字符轉換爲一系列解碼字符,如< U + 009B>和0033200400 \ 0031 \ 0031。如何在Haskell中按原樣處理和保存HTTP主體?

openURL x = getResponseBody =<< simpleHTTP (getRequest x) 

download url path = do src <- openURL url 
        writeFile path src 

如何更改以下代碼以完全按照接收的方式編寫HTTP響應?如何在這些內容中搜索和操縱字符串?

+1

你能給出一個完整的示例程序,其中包含一個顯示行爲的URL嗎?這會讓其他人更容易向你展示工作代碼。 –

回答

1

像「\ 1234 \ 5678」這樣的字符串輸出實際上只有兩個字符長 - 數據被保留,但您需要正確解釋它。可能最好的方法是使用Text,而不是列表Char s,實際上是一個表示UTF-8碼點的字節數組。

爲此,您需要在HTTP mkRequest :: BufferType ty => RequestMethod -> URI -> Request ty中使用稍微更一般的接口。 Text不直接實例化BufferType,所以我們將通過ByteString,它代表數據的二進制塊 - 它沒有對該數據編碼的特定解釋。

然後我們可以使用decodeUtf8到原始字節轉換爲UTF-8 Text

import Data.Text 
import Data.Text.Encoding 
import Data.ByteString 

\ uri -> do 
    rawData <- getResponseBody =<< simpleHTTP (mkRequest GET uri) :: IO Text 
    return (decodeUtf8 rawData) 

注意decodeUtf8是局部的,它可能在強制重新啓動或處理程序不能在純代碼捕獲的方式失敗一直在你的IO堆棧中。如果這是不可取的,如果您很有可能下載的文本不是有效的UTF-8,那麼您可以使用decodeUtf8'返回Either