看起来 GHC 在决定解码字符编码方面至少是不一致的。
考虑一个名为 omatase-shimashita.txt
的文件,其内容如下,以 UTF-8 编码:お待たせしました。
readFile
似乎可以正确读取这个文件...
Prelude> content <- readFile "/home/chris/Desktop/omatase-shimashita.txt"
Prelude> length content
8
Prelude> putStrLn content
お待たせしました
然而,如果我写一个简单的“echo”服务器,它默认不会解码为UTF-8。考虑下面处理传入客户端的代码:
handleClient handle = do
line <- hGetLine handle
putStrLn $ "Read following line: " ++ toString line
handleClient handle
并且相关的客户端代码,明确地发送 UTF-8:
Data.ByteString.hPutStrLn handle $ Codec.Binary.UTF8.Generic.fromString "お待たせしました"
这不是一致的行为吗?这背后有什么方法吗?我计划重写我的应用程序,明确使用 ByteString
对象并使用 Codec.Binary.UTF8
明确地进行编码和解码,但无论如何了解这里发生了什么都是好的... :o/
更新:我正在运行 Ubuntu Linux 版本 10.10,区域设置为 en_US.UTF-8...
$ cat /etc/default/locale
LANG="en_US.UTF-8"
$ echo $LANG
en_US.UTF-8
Codec.Binary.UTF8
进行编码/解码,使用Data.ByteString
发送/接收原始字节。据推测,chrisdb的解决方案应该是可行的;对我来说,在我测试我的玩具服务器/客户端时它起作用了,但在我尝试在我的真实应用程序上运行时却没有起作用(这可能是由于我错过了一些细节,但我变得不耐烦并采用了ByteString
方法)。 - Chris W.