當我嘗試讀取一個爲Text
的UTF8文本文件時,我試圖使用Data.Text.IO.readFile
。
但是,當系統環境的語言環境不是*.UTF8
(特別是c
)時,它不起作用。
它說hGetContents: invalid argument (invalid byte sequence)
有沒有辦法處理與Data.Text.IO.hGetContents編碼?
是的,我讀了文件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)
。
有沒有辦法處理編碼Data.Text.IO.hGetContents
或Data.Text.IO.readFile
而不改變系統環境變量如LANG
? 只需編輯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
這些作品時,系統的locale是*.UTF8
,並未能與其他環境。
測試環境的信息:
- 的Linux(Ubuntu的14.04)
- GHC 7.10.3
text
1.2.2.0
對於任何需要在'data.md'中隨機使用非ASCII字符的人來測試這個:'äüöÄÜÖßáéúíóð¾<èÉ쀆â'r'' – Zeta