2012-04-09 44 views
5

Tôi đang gặp khó khăn trong việc tìm hiểu điều này. Dưới đây là những gì tôi đang cố gắng:Giải nén GZip trong Haskell

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) 

Tại sao tôi nhận được ngoại lệ đó?

Tôi cũng đã thử Codec.Compression.GZip.decompress từ số zlib package, nhưng tôi không thể làm cho các loại hoạt động với String thay vì ByteString.

+1

Đây không phải là câu trả lời hoàn chỉnh, nhưng có lẽ 'readFile' đang cố gắng giải mã' test.html.gz' như thể văn bản được mã hóa trong mã hóa hệ thống của bạn. Thay vào đó, hãy sử dụng một tệp nhị phân. –

Trả lời

8

Việc quy đổi ByteString-String phụ thuộc vào mã hóa ký tự của tập tin nén, nhưng giả định đó là ASCII hoặc Latin-1, điều này sẽ làm việc:

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 

Nếu bạn cần phải làm việc với một số mã khác như UTF-8, thay thế unpack bằng chức năng giải mã thích hợp, ví dụ Data.ByteString.Lazy.UTF8.toString.

Tất nhiên, nếu tệp bạn giải nén không phải là tệp văn bản, tốt hơn là giữ nó dưới dạng ByteString.

+2

Và nếu có, giải nén và sau đó giải mã thành văn bản – alternative

Các vấn đề liên quan