readFile "file.html"
"start of the file... *** Exception: file.html: hGetContents: invalid argument (invalid code page byte sequence)
这是用记事本++创建的UTF-8文件...如何在haskell中读取文件?
readFile "file.html"
"start of the file... *** Exception: file.html: hGetContents: invalid argument (invalid code page byte sequence)
这是用记事本++创建的UTF-8文件...如何在haskell中读取文件?
默认情况下,文件是在系统区域设置中读取的,因此如果您有使用非标准编码的文件,则需要自己设置文件句柄的编码。
foo = do
handle <- openFile "file.html" ReadMode
hSetEncoding handle utf8_bom
contents <- hGetContents handle
doSomethingWithContents
hClose handle
应该让你开始。请注意,这不包含错误处理,因此更好的方法
import Control.Exception -- for bracket
foo = bracket
(openFile "file.html" ReadMode >>= \h -> hSetEncoding h utf8_bom >> return h)
hClose
(\h -> hGetContents h >>= doSomething)
要么
foo = withFile "file.html" ReadMode $
\h -> do hSetEncoding h utf8_bom
contents <- hGetContents h
doSomethingWith contents
根据 这个网站,你的6个字节解码如下:
EF BB BF -> ZERO WIDTH NO-BREAK SPACE (i.e. the BOM, although its not needed in UTF-8
C4 8D -> LATIN SMALL LETTER C WITH CARON (what you said)
0D -> CARRIAGE RETURN (CR)
所以它是一个合法的UTF-8序列。
但是标准Prelude函数最初只是执行ASCII。我不知道他们现在做了什么,但看到这个问题 GHC / Haskell如何决定从哪个字符编码解码/编码? 一些更多的想法。然后使用 http://hackage.haskell.org/package/utf8-string 而不是Prelude功能。