gpt4 book ai didi

haskell - 是否无法使用 Data.Text.IO.hGetContents 处理编码?

转载 作者:行者123 更新时间:2023-12-02 14:29:58 25 4
gpt4 key购买 nike

当我尝试将 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) .

有没有办法处理 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

当系统的区域设置为 *.UTF8 时,这些功能有效。 ,并且在其他环境中失败。

测试环境信息:

  • Linux(Ubuntu 14.04)
  • GHC 7.10.3
  • text 1.2.2.0

最佳答案

我遇到了一些不同的错误:

<stdout>: hPutChar: invalid argument (invalid character)

即使使用System.IO.hGetContents,我也会遇到相同的错误。不确定为什么您的行为有所不同。(我正在使用 ghc-7.10.2text-1.2.1.3)

回答这个问题:您正在尝试将 UTF-8 编码的字符串发送到配置为 ASCIIstdout。我不确定它应该输出什么。

如果您的终端实际上​​接受 UTF-8,那么您可以配置 stdout 以忽略当前区域设置并接受 UTF-8:

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.hSetEncoding stdout System.IO.utf8_bom
T.hPutStrLn stdout text

关于haskell - 是否无法使用 Data.Text.IO.hGetContents 处理编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34933725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com