在haskell中处理字符串编码的正确方法是什么?

时间:2014-02-23 09:01:11

标签: haskell encoding utf-8

我在Windows上使用代码页949 ..而Excel和Notepad.exe将很乐意使用cp949编码保存文件。

使用str.encodestr.decode处理python并不是一件痛苦的事。

最近我发现了Haskell,似乎有不止一种方法来操纵字符串。现实世界haskell告诉我使用ByteString来提高效率,但是我没有办法在我使用的编码之间切换。

我必须读取非UTF8编码的文件,并以原始编码将其写回。其中大部分都是cp949

我的haskell源内部将位于utf8

在python中并没有那么难,原则是str用于IO,unicode进行处理,但在haskell上,他们甚至缺乏内置的cp949支持。

所以问题是 - 如何通过各种编码对文件执行IO?我必须阅读,转换,处理和编写它们。


编辑:

我尝试了两个选项......似乎Windows上的文本转换状态很糟糕。

text-icu

的优点:

  • text似乎是文本处理的现代高级选择
  • 在Windows上轻松安装:在使用include安装lib时,只需抓取icu binaries并指向text-icucabal install个文件夹。

缺点:

  • 转换器是IO
  • 无法多次初始化转换器(与线程安全有关,我得到运行时错误)
  • 不适用于Lazy bytestrings
  • 需要> 20mb dlls

的iconv

的优点:

  • no monads

缺点:

  • 在Windows上安装的痛苦
  • 当我尝试使用较大的文件时出现一些解码失败..通常对于iconv(命令行或dll),您必须提供无缓冲的输入才能获得正确的输出,但haskell的绑定似乎只适用于延迟的字节串

2 个答案:

答案 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获得转换器一次就好的情况。