在Haskell中执行UTF-8的简单库(因为Streams不再编译)

时间:2009-07-30 13:36:09

标签: haskell utf-8

我只想阅读(也许写)UTF-8数据。 haskell.org仍然宣传System.Streams,它不能用最近的ghc编译:

% runhaskell Setup.lhs configure
Configuring Streams-0.2.1...
runhaskell Setup.lhs build
Preprocessing library Streams-0.2.1...
Building Streams-0.2.1...
[10 of 45] Compiling System.FD        ( System/FD.hs, dist/build/System/FD.o )

System/FD.hs:138:22:
    Couldn't match expected type `GHC.IOBase.FD'
           against inferred type `FD'
    In the first argument of `fdType', namely `fd'
    In a 'do' expression: fd_type <- fdType fd
    In the expression:
        let
          oflags1 = case mode of
                      ReadMode -> ...
                      WriteMode -> ...
                      ReadWriteMode -> ...
                      AppendMode -> ...
          binary_flags | binary = o_BINARY
                       | otherwise = 0
          oflags = oflags1 .|. binary_flags
        in
          do fd <- fdOpen filepath oflags 438
             fd_type <- fdType fd
               when (mode == WriteMode && fd_type == RegularFile)
             $ do fdSetFileSize fd 0
             ....

Streams 0.1的类似问题。自官方网站关闭以来,我无法获得更新的版本:

% wget http://files.pupeno.com/software/streams/Streams-0.1.7.tar.bz2
--2009-07-30 15:36:14--  http://files.pupeno.com/software/streams/Streams-0.1.7.tar.bz2
Resolving files.pupeno.com... failed: Name or service not known.
wget: unable to resolve host address `files.pupeno.com'

更好的解决方案? darcs source code

3 个答案:

答案 0 :(得分:4)

答案 1 :(得分:1)

编辑:

升。 Kolmodin是对的:utf8-string或text是正确的答案。我将在下面留下我的原始答案以供参考。谷歌似乎在选择IConv时引导我。 (相当于我的IConv包装函数已经在utf8-string中作为Codec.Binary.UTF8.String.encodeString。)


以下是我一直在使用的内容 - 我可能不记得完整的解决方案,所以如果您仍然遇到问题请告诉我:

从Hackage中,安装IConv。不幸的是,Codec.Text.IConv.convert对字节串而不是字符串进行操作。我猜你可以直接读取文件作为字节串,但我写了一个转换器,因为HaXml使用普通字符串:

import qualified Data.ByteString.Lazy.Char8 as B
utf8FromLatin1 = B.unpack . convert "LATIN1" "UTF-8" . B.pack

现在,在Mac OS上,您必须使用

进行编译
$ ghc -O2 --make -L/usr/lib -L/opt/local/lib Whatever.hs

因为存在一些库冲突,我认为对于MacPorts,我必须明确指向内置的iconv库。可能有一种方法可以将这些-L标志传递给ghc,但我还没有查找过。

答案 2 :(得分:-1)

utf-8字符串只是字节字符序列,因此应该可以按原样读取和写入字符串。所有前127个字符,包括空格,都应该是ascii。当然,您需要自己的函数来操作字符串,因为它们现在是多字节序列。