我尝试使用以下代码来下载HTML,但它实际上将非ASCII字符转换为一系列解码后的字符,例如< U + 009B>和0033200400 \ 0031 \ 0031。
openURL x = getResponseBody =<< simpleHTTP (getRequest x)
download url path = do src <- openURL url
writeFile path src
如何更改以下代码以完全按照收到的方式编写HTTP响应?如何在这样的内容中搜索和操纵字符串?
答案 0 :(得分:1)
字符串输出如“\ 1234 \ 5678”实际上只有两个字符长 - 数据被保留,但您需要正确解释它。可能最好的方法是使用Text
,而不是Char
的列表,实际上是一个表示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
。