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

在Haskell中执行UTF-8的简单库(因为流不再编译),haskell,utf-8,Haskell,Utf 8,我只想读取(或者写入)UTF-8数据。haskell.org仍在发布未使用最新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/

我只想读取(或者写入)UTF-8数据。haskell.org仍在发布未使用最新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
             ....
%runhaskell Setup.lhs配置
正在配置Streams-0.2.1。。。
runhaskell Setup.lhs build
预处理库流-0.2.1。。。
正在构建Streams-0.2.1。。。
[10/45]编译System.FD(System/FD.hs,dist/build/System/FD.o)
系统/FD.hs:138:22:
无法匹配预期的类型“GHC.IOBase.FD”
针对推断类型'FD'
在'fdType'的第一个参数中,即'fd'
在“do”表达式中:fd_类型。。。
WriteMode->。。。
ReadWriteMode->。。。
追加模式->。。。
二进制标志|二进制=o二进制
|否则=0
oflags=oflags1.|。二进制_标志
在里面

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

编辑:

L.Kolmodin是正确的:utf8字符串或文本是正确的答案。我将在下面留下我的原始答案以供参考。谷歌似乎让我错误地选择了IConv。(与我的IConv包装函数等效的函数已经在utf8字符串中作为
Codec.Binary.utf8.string.encodeString


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

从黑客,安装。不幸的是,
Codec.Text.IConv.convert
操作的是bytestring,而不是字符串。我想您可以将文件直接读取为ByTestRing,但我编写了一个转换器,因为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,但我还没有找到它。

使用或更新的包


.

当然,我想解释它们,而不仅仅是作为二进制读取。Haskell字符串由字符组成,而不是字节。您没有说过要解释它们。有些应用程序不需要解释实际的字符串数据。100%同意Kolmodin。使用utf8字符串或Data.TextData.Text似乎很新,它不是为Debian打包的(无论是“稳定”还是“测试”)。我可以安装它从黑客,但我更喜欢保持我的系统“干净”。utf8字符串可与ghc,是简单的使用和满足我的需要。谢谢,接受。
$ ghc -O2 --make -L/usr/lib -L/opt/local/lib Whatever.hs