2012-04-09 20 views
5

私はこれを理解するのに苦労しています。ここに私がしようとしているもの:ハスケルでGZipを解凍する

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 packageからCodec.Compression.GZip.decompressを試してみましたが、私はタイプがString代わりのByteStringに動作するように取得することはできません。

+1

これは完全な答えではありませんが、 'readFile'は' test.html.gz'をシステムエンコーディングでエンコードされているようにデコードしようとしています。代わりにバイナリ読み取りを使用してください。 –

答えて

8

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として保存することをお勧めします。

+2

そうであれば、解凍してテキストにデコードします – alternative

関連する問題