我使用Windows,编码为949。Excel和Notepad.exe可以保存编码为cp949的文件,但在Python中处理这些文件很容易,只需使用str.encode和str.decode即可。
最近我发现了Haskell,似乎有多种方法可以操作字符串。《Real World Haskell》告诉我要使用ByteString进行高效的IO,但我不知道如何在不同编码之间切换。
我必须读取不是UTF8编码的文件,并将它们以原始编码写回去,其中大部分将是cp949。
我的Haskell源代码内部将使用utf8编码。
在Python中,使用str进行IO,unicode进行处理原理很简单,但在Haskell中,甚至缺少内置的cp949支持。
因此,问题是:如何在各种编码下进行文件IO?我必须读取、转换、处理和写入它们。
最近我发现了Haskell,似乎有多种方法可以操作字符串。《Real World Haskell》告诉我要使用ByteString进行高效的IO,但我不知道如何在不同编码之间切换。
我必须读取不是UTF8编码的文件,并将它们以原始编码写回去,其中大部分将是cp949。
我的Haskell源代码内部将使用utf8编码。
在Python中,使用str进行IO,unicode进行处理原理很简单,但在Haskell中,甚至缺少内置的cp949支持。
因此,问题是:如何在各种编码下进行文件IO?我必须读取、转换、处理和写入它们。
编辑:
我尝试了两个选项,但是在Windows上的文本转换状态很糟糕。
text-icu
优点:
text
似乎是现代化、高级的文本操作选择- 在Windows上易于安装:只需获取 icu二进制文件并在使用
cabal install
安装text-icu
时指定include
和lib
文件夹即可。
缺点:
- 转换器是IO
- 无法多次初始化转换器(与线程安全有关,会出现运行时错误)
- 不适用于
Lazy
bytestrings - 需要>20MB的dlls
iconv
优点:
- 没有单子
缺点:
- 在Windows上安装很麻烦
- 尝试处理大文件时存在一些解码失败的情况..通常对于
iconv
(命令行或DLL),您必须提供无缓冲输入以获得正确的输出,但Haskell的绑定似乎只能使用lazy bytestrings。
cp949
编码,但每当你需要处理文本编码时,通常最好使用text
包而不是bytestring
。 - Danny Navarro