在Haskell中使用“US-ASCII”编码读取文件:hGetContents:无效参数(无效字节序列)

时间:2015-11-06 20:12:23

标签: file haskell encoding io

我正在使用Haskell编写解析器,但是这个错误是我无法通过的错误。这是我的代码:

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”,但错误仍然存​​在。有没有办法读取这些文件,或任何类型的文件处理编码问题?

1 个答案:

答案 0 :(得分: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是一个不错的选择,尽管它不是唯一的可能性。