【问题标题】:ByteStrings, Text, and encoding in HaskellHaskell 中的字节字符串、文本和编码
【发布时间】:2013-12-21 07:52:05
【问题描述】:

我希望使用Data.Text 的 IO 功能获取输入文本。我的困惑与编码发现有关。也就是说,如果我事先不知道文本的编码,那么在正在读取的文本的编码与系统区域设置不同的情况下,Data.Text 中的 IO 有什么用处? Data.Text某处是否有编码发现机制?

我知道我可能会收到一堆回复说“使用Data.ByteString”,但创建Data.Text 的目的不是为了避免使用Data.ByteString 来阅读文本吗?

另外,如果我必须使用Data.ByteString,有谁知道读取八位字节 0x80 到 0x9f 时会发生什么?他们是否像其他输入一样按预期读入?它们在 ISO-8859-1 中未定义,Data.ByteString 的 IO 似乎表明输入被视为源是 ISO-8859-1。

【问题讨论】:

  • “Data.Text 中是否有编码发现机制?” No.
  • 您在哪里看到表明输入 ByteString 会将输入视为 ISO-8859-1 的内容?
  • 在 [Data.ByteString](hackage.haskell.org/package/bytestring-0.10.4.0/docs/…) 的规范中 - 也存在于其惰性和 char8 变体中 - 在 hGetContents 的定义下
  • 嗯。我不明白那句话,我想知道它是否错误/过时。我希望以二进制模式打开文件根本不会导致编码更改。

标签: haskell character-encoding io


【解决方案1】:

您需要使用ByteString 来读取字节,例如:

decodeUtf8' :: ByteString -> Either UnicodeException Text

Data.Text.Encoding 实际解码原始数据并处理任何编码错误。 text 中没有预定义的机制来猜测编码,但你可以尝试多次解码,或者使用 ICU 的字符集检测工具。不幸的是,text-icu 目前不提供该功能,因此您需要自己导入。

【讨论】:

  • 谢谢。我只是想知道是否有比这更笨重的东西,但我想它必须这样做。
【解决方案2】:

如果您事先不知道编码,我认为使用Data.ByteString 并以二进制模式读取是完全正确的做法。您应该得到与字节完全相同的输入数据,包括 0x80 到 0x9f 八位字节。

Data.Text 是用已知编码或更确切地说以解码形式表示某些东西的正确方法,但是如果您无法在读取时进行解码,那么我认为此时使用它是没有意义的.

如果您的代码以后可以适当地学习或猜测编码,那就是进行切换的正确时机。

【讨论】:

  • 谢谢。我想知道是否有办法绕过它,但我想没有。
  • 我想我的意思是没有什么可以解决的 :-) ByteString 是正确的表示,直到你知道编码。
猜你喜欢
  • 2020-03-22
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
  • 2015-06-10
相关资源
最近更新 更多