readFile "file.html"
"start of the file... *** Exception: file.html: hGetContents: invalid argument (invalid code page byte sequence)
これはnotepad++で作成された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シーケンスです。
ただし、標準のプレリュード関数は元々ASCIIを実行していました。彼らが今何をしているのかわかりませんが、この質問を参照してください。GHC/ Haskellは、どの文字エンコードをデコード/エンコード元/に送信するかをどのように決定しますか?いくつかのアイデアのために。そして、プレリュード関数の代わりにhttp://hackage.haskell.org/package/utf8-stringを使用します。