Data.ByteString.hGetContents的文档说
与hGet一样,文件中的字符串表示形式假定为ISO-8859-1。
为什么要“假设”任何关于“文件中的字符串表示”的内容?数据不一定是字符串或编码文本。如果我想要处理编码文本,我会使用Data.Text或者Data.ByteString.Char8。我认为ByteString的重点是数据是作为8位字节的列表处理的,而不是文本字符。假设它是ISO-8859-1会产生什么影响?
答案 0 :(得分:5)
这是一个迂回的方式来说同样的事情 - 没有执行解码(因为编码是8位,不需要做任何事情),所以hGetContents
给你的字节范围是0x00 - 0xFF:
$ cat utf-8.txt
ÇÈÄ
$ iconv -f iso8859-1 iso8859-1.txt
ÇÈÄ
$ ghci
> openFile "iso8859-1.txt" ReadMode >>= (\h -> fmap BS.unpack $ BS.hGetContents h)
[199,200,196,10]
> openFile "utf-8.txt" ReadMode >>= (\h -> fmap BS.unpack $ BS.hGetContents h)
[195,135,195,136,195,132,10]
答案 1 :(得分:0)
也许它与this类似,然后:
有些情况下编码处理不正确但事情仍然有效。经常遇到的情况是设置为latin-1的数据库和使用UTF-8(或任何其他编码)的应用程序。几乎任何1和0的组合在单字节latin-1编码方案中都是有效的。如果数据库从一个看起来像11100111 10111000 10100111的应用程序接收文本,它会愉快地存储它,认为该应用程序意味着存储三个拉丁字符“縧”。毕竟,为什么不呢?然后它将这个位序列返回给应用程序,它很乐意接受它作为最初存储的“绦”的UTF-8序列。数据库管理界面自动确定数据库设置为latin-1,并将任何文本解释为latin-1,因此所有值仅在管理界面中显示为乱码。