2015-11-06 18 views
4

我使用Haskell編程解析器,但是這個錯誤是我無法通過的牆。這裏是我的代碼:在Haskell中使用「US-ASCII」編碼讀取文件:hGetContents:無效參數(無效字節序列)

main = do 
    arguments <- getArgs 
    let fileName = head arguments 
    fileContents <- readFile fileName 
    converter <- open "UTF-8" Nothing 
    let titleLength   = length fileName 
     titleWithoutExtension = take (titleLength - 4) fileName 
     allNonEmptyLines  = unlines $ tail $ filter (/= "") $ lines fileContents 

當我嘗試閱讀「US-ASCII」編碼文件,我得到了著名的錯誤hGetContents:無效的參數(無效字節序列)。我試圖通過「US-ASCII」在我的代碼中更改「UTF-8」,但錯誤仍然存​​在。有沒有辦法讀取這些文件,或任何類型的文件處理編碼問題?

回答

5

你應該hSetEncoding配置文件句柄的特定文本的編碼,如:

import System.Environment 
import System.IO 

main = do 
    (path : _) <- getArgs 
    h <- openFile path ReadMode 
    hSetEncoding h latin1 
    contents <- hGetContents h 
    -- no need to close h 
    putStrLn $ show $ length contents 

如果文件中包含非ASCII字符,這不是UTF8編碼,然後處理latin1是一個不錯的選擇,雖然它不是唯一的可能性。

+0

只是好奇:爲什麼沒有必要關閉句柄?就在本週我使用'withFile',因爲我認爲這可以節省我手動關閉句柄。 – somesoaccount

+1

因爲'hGetContents'會在您消耗完所有輸入後關閉它。 – ErikR

+0

@ErikR現在我的程序正常運行!謝謝。請你能告訴我其他的可能性嗎? – freinn

相關問題