0

我尝试使用以下代码下载 HTML,但它实际上将非 ASCII 字符转换为一系列解码字符,如 < U+009B> 和 0033200400\0031\0031。

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

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

如何更改以下代码以完全按照接收到的方式编写 HTTP 响应?应该如何搜索和操作此类内容中的字符串?

4

1 回答 1

1

像“\1234\5678”这样的字符串输出实际上只有两个字符长——数据被保留了,但您需要正确解释它。可能最好的方法是使用Textwhich 而不是Chars 的列表,实际上是一个表示 UTF-8 代码点的字节数组。

为此,您需要在 HTTP 中使用稍微更通用的接口mkRequest :: BufferType ty => RequestMethod -> URI -> Request tyText不直接实例化BufferType,所以我们将通过ByteString,它表示二进制数据块——它对该数据的编码没有特别的解释。

然后我们可以使用decodeUtf8将原始字节转换为 UTF-8Text

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'which 返回一个Either.

于 2013-09-10T21:43:57.350 回答