我在Windows上使用代码页949 ..而Excel和Notepad.exe将很乐意使用cp949
编码保存文件。
使用str.encode
和str.decode
处理python并不是一件痛苦的事。
最近我发现了Haskell,似乎有不止一种方法来操纵字符串。现实世界haskell告诉我使用ByteString
来提高效率,但是我没有办法在我使用的编码之间切换。
我必须读取非UTF8编码的文件,并以原始编码将其写回。其中大部分都是cp949
。
我的haskell源内部将位于utf8
。
在python中并没有那么难,原则是str
用于IO,unicode
进行处理,但在haskell上,他们甚至缺乏内置的cp949
支持。
所以问题是 - 如何通过各种编码对文件执行IO?我必须阅读,转换,处理和编写它们。
我尝试了两个选项......似乎Windows上的文本转换状态很糟糕。
text-icu
的优点:
text
似乎是文本处理的现代高级选择include
安装lib
时,只需抓取icu binaries并指向text-icu
和cabal install
个文件夹。缺点:
Lazy
bytestrings 的iconv
的优点:
缺点:
iconv
(命令行或dll),您必须提供无缓冲的输入才能获得正确的输出,但haskell的绑定似乎只适用于延迟的字节串答案 0 :(得分:4)
您可以使用Codec.Text.IConv
包中的iconv
模块:
http://hackage.haskell.org/package/iconv-0.4.1.2/docs/Codec-Text-IConv.html
convert
函数将从一种编码转换为另一种编码,因此您可以将CP949 ByteString转换为UTF8 ByteString(如果需要,则转换为Text。)
你也可以逆转这个过程(文字 - > UTF8 ByteString - > CP949 ByteString)
以下是我在github上找到的一些示例代码:
https://github.com/wookay/da/blob/master/haskell/fun/test_encode.hs
答案 1 :(得分:4)
您可以Convert
module使用text-icu
package {{3}}进行text
不直接支持的编码。
假设您已经获得了编码ByteString
,您可以执行以下操作:
import qualified Data.Text.ICU.Convert as Convert
decodeCP949 :: ByteString -> IO Text
decodeCP949 bs = do
conv <- Convert.open "cp949" Nothing
return $ Convert.toUnicode conv bs
encodeCP949 :: Text -> IO ByteString
encodeCP949 t = do
conv <- Convert.open "cp949" Nothing
return $ Convert.fromUnicode conv t
IO
这里有点烦人。我认为这是一个使用unsafePerfomIO
获得转换器一次就好的情况。