2012-04-09 11 views
5

Me está costando trabajo descifrar esto. Esto es lo que estoy intentando:Descomprimir GZip en 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) 

¿Por qué recibo esa excepción?

También probé Codec.Compression.GZip.decompress del zlib package, pero no puedo conseguir los tipos de trabajo a String en lugar de ByteString.

+1

Esta no es una respuesta completa, pero probablemente 'readFile' intente decodificar' test.html.gz' como si fuera un texto codificado en la codificación de su sistema. Use una lectura binaria en su lugar. –

Respuesta

8

La conversión de ByteString a String depende de la codificación de caracteres del archivo comprimido, pero asumiendo que es ASCII o Latin-1, esto debería funcionar:

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 

Si es necesario trabajar con alguna otra codificación como UTF-8, reemplace unpack con una función de decodificación apropiada, por ej. Data.ByteString.Lazy.UTF8.toString.

Por supuesto, si el archivo que está descomprimiendo no es un archivo de texto, es mejor mantenerlo como ByteString.

+2

Y si lo es, descomprime y luego decodifica para enviar mensajes de texto – alternative

Cuestiones relacionadas