6

私はこれを理解するのに苦労しています。これが私が試していることです:

ghci> :m +System.FileArchive.GZip  -- From the "MissingH" package
ghci> fmap decompress $ readFile "test.html.gz"
*** Exception: test.html.gz: hGetContents: invalid argument (invalid byte sequence)

なぜその例外が発生するのですか?

zlibパッケージCodec.Compression.GZip.decompressからも試しましたが、の代わりに型を機能させることができません。StringByteString

4

1 に答える 1

9

ByteStringからへの変換Stringは、圧縮ファイルの文字エンコードに依存しますが、ASCIIまたはLatin-1であると仮定すると、これは機能するはずです。

import Codec.Compression.GZip (decompress)
import qualified Data.ByteString.Lazy as LBS
import Data.ByteString.Lazy.Char8 (unpack)

readGZipFile :: FilePath -> IO String
readGZipFile path = fmap (unpack . decompress) $ LBS.readFile path

UTF-8などの他のエンコーディングを使用する必要がある場合はunpack、適切なデコード関数に置き換えてData.ByteString.Lazy.UTF8.toStringください。

もちろん、解凍するファイルがテキストファイルでない場合は、として保持することをお勧めしますByteString

于 2012-04-10T01:15:42.053 に答える