我有一个包含奇怪字符的文件MAIL.txt
(此文件来自Windows,我在Linux上)。它包含字符串rec
。当我在终端中运行grep "rec" MAIL.txt
时,我得到了预期的输出。
但是这个命令在Haskell中失败了:
Prelude System.Process> r <- readProcessWithExitCode "grep" ["rec", "MAIL.txt"] ""
*** Exception: fd:13: hGetContents: invalid argument (invalid byte sequence)
有什么解释,有没有办法避免这种情况(不修改奇怪的文件)?
以下是grep
的输出,您可以在其中看到奇怪的字符:
事实上,这些应该是重音字母。
我无法使用readFile
读取文件:
> r <- readFile "MAIL.txt"
> r
"Bonjour,\r\n\r\n Quelques remarques sur cette fiche :\r\n\r\n- *** Exception: MAIL.txt: hGetContents: invalid argument (invalid byte sequence)
也许有办法用Data.Binary检测问题?
详细说明@ ErikR的回答:
import System.Process.ByteString (readProcessWithExitCode)
import Data.ByteString (ByteString, empty)
import qualified Data.ByteString.Char8 as B
import System.Exit (ExitCode)
(err, stdout, stderr) <- readProcessWithExitCode "grep" ["rec", "MAIL.txt"] empty
B.putStrLn stdout
答案 0 :(得分:2)
使用process-extras包中的readProcessWithExitCode
或readCreateProcessWithExitCode
。他们返回ByteStrings:
readProcessWithExitCode :: FilePath -> [String] -> ByteString
-> IO (ExitCode, ByteString, ByteString)
存在其他版本的返回延迟字节和文本。
编辑:更新了链接,因为不推荐使用process-listlike来支持进程附加功能。