Haskell中的ByteStrings,Text和编码

时间:2013-12-21 07:52:05

标签: haskell character-encoding io

我希望使用Data.Text的IO功能获取输入文本。我的quandry与编码发现有关。也就是说,如果我之前不知道文本的编码,那么在读取的文本的编码与系统区域设置不同的情况下,Data.Text中的IO如何完全使用? ? Data.Text中是否有编码发现机制?

我知道我可能会收到一些回复,说"使用Data.ByteString"但是为了远离使用而没有创建Data.Text Data.ByteString用于阅读文字?

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

2 个答案:

答案 0 :(得分:5)

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

decodeUtf8' :: ByteString -> Either UnicodeException Text

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

答案 1 :(得分:3)

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

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

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