我希望使用 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
是用已知编码表示某些东西的正确方法,或者更确切地说是以解码形式表示的东西,但如果你不能在读取时进行解码,那么我认为在这一点上使用它是没有意义的。
如果你的代码以后可以适当地学习或猜测编码,那么这是进行切换的合适时机。