【发布时间】:2016-01-22 05:54:27
【问题描述】:
当我尝试将 UTF8 文本文件读取为 Text 时,我尝试使用 Data.Text.IO.readFile。
但是,当系统环境的语言环境不是*.UTF8(尤其是c)时,它就不起作用了。
它说hGetContents: invalid argument (invalid byte sequence)
是的,我阅读了文档 Data.Text.IO 中的语言环境支持部分。
它说Data.Text.IO取决于系统环境的设置。
因此,我尝试将Data.Text.IO.hGetContents 函数与System.IO.hSetEncoding h System.IO.utf8_bom 一起使用。
当我将它与System.IO.hGetContents 一起使用时,这很有效。
但是,Data.Text.IO.hGetContents 表示 text: <stdout>: commitAndReleaseBuffer: invalid argument (invalid character)。
有没有办法在不改变系统环境变量(例如LANG)的情况下处理Data.Text.IO.hGetContents 或Data.Text.IO.readFile 的编码?
首选只编辑 Haskell 代码的方法。
这是我的原始代码:
import qualified Data.Text as T
import qualified Data.Text.IO as T
main = do
text <- T.readFile "./data.md"
T.putStrLn text
这是我的试用代码:
import qualified Data.Text as T
import qualified Data.Text.IO as T
import System.IO
main = do
h <- System.IO.openFile "./data.md" System.IO.ReadMode
System.IO.hSetEncoding h System.IO.utf8_bom
text <- T.hGetContents h -- `System.IO.hGetContents h` works!
T.putStrLn text
当系统的区域设置为 *.UTF8 时,这些方法有效,而在其他环境中失败。
测试环境信息:
- Linux (Ubuntu 14.04)
- GHC 7.10.3
-
text1.2.2.0
【问题讨论】:
-
对于任何需要在
data.md中随机非ASCII 来测试这个的人:äüöÄÜÖßáéúíóð¾‹èɵ€†¤r’
标签: haskell text encoding utf-8