我只想阅读(也许写)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?
答案 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。当然,您需要自己的函数来操作字符串,因为它们现在是多字节序列。