12
readFile "file.html"
"start of the file... *** Exception: file.html: hGetContents: invalid argument (invalid code page byte sequence)

これはnotepad++で作成されたUTF-8ファイルです...haskellでファイルを読み取るにはどうすればよいですか?

4

2 に答える 2

13

デフォルトでは、ファイルはシステムロケールで読み取られるため、非標準のエンコーディングを使用するファイルがある場合は、ファイルハンドルのエンコーディングを自分で設定する必要があります。

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
于 2012-10-15T20:33:53.130 に答える
2

このサイトによると、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を使用します。

于 2012-10-15T21:20:41.597 に答える