Haskell中的ByteStrings,Text和编码

Mik*_*zel 5 io haskell character-encoding

我希望使用IO功能获取输入文本Data.Text.我的quandry与编码发现有关.也就是说,如果我之前没有意识到文本Data.Text的编码,那么在读取的文本的编码与系统区域设置不同的情况下,如何使用IO 呢?在某处有编码发现机制Data.Text吗?

我知道我可能会得到一堆说"使用Data.ByteString" 的回复,但是不是Data.Text为了远离Data.ByteString用于阅读文本的目的而创建的?

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

Jon*_*rdy 5

您将要ByteString用于读取字节,例如:

decodeUtf8' :: ByteString -> Either UnicodeException Text
Run Code Online (Sandbox Code Playgroud)

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


GS *_*ica 3

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

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

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