ByteStrings, Text, and encoding in Haskell



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

我知道我可能会收到一堆"使用Data.ByteString"的回复,但Data.Text不是为了摆脱使用Data.ByteString阅读文本而创建的吗?

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

您需要

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

decodeUtf8' :: ByteString -> Either UnicodeException Text

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

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

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

如果你的代码以后可以适当地学习或猜测编码,那么这是进行切换的合适时机。

最新更新