GHC截断Unicode字符输出

GHC截断Unicode字符输出,unicode,haskell,ghc,Unicode,Haskell,Ghc,我无法让GHCi或GHC打印unicode代码点221A(sqrt符号:√). 我不认为这是我的shell,因为我可以让ruby来做: irb> puts "\u221A" √ GHC/GHCi是另一个问题: ghci> putStrLn "\8730" ghci> withFile "temp.out" WriteMode $ flip hPutStrLn "\8730" ghci> readFile "temp.out" "\SUB\n" 那么我做错了什么 (G

我无法让GHCi或GHC打印unicode代码点221A(sqrt符号:√).

我不认为这是我的shell,因为我可以让ruby来做:

irb> puts "\u221A"
√
GHC/GHCi是另一个问题:

ghci> putStrLn "\8730"

ghci> withFile "temp.out" WriteMode $ flip hPutStrLn "\8730"
ghci> readFile "temp.out"
"\SUB\n"
那么我做错了什么


(GHC v6.l0.3)

GHC使用unicode的行为是使用unicode字符串“做正确的事情”。以前的版本在IO上截断为8位字符(强制使用编码库)

也就是说,“\8730”是0x221a,“\SUB”是0x1a——高位字节消失了

以下是GHC 7:

Prelude> print "√\n"
"\8730\n"
Prelude> putStr "√\n"
√
Prelude> putStr "\8730√\n"
√√
但我在GHC 6.8中得到了您的结果。如下所示:

Prelude> writeFile "/tmp/x" "√\n"
Prelude> readFile "/tmp/x"
"\SUB\n"
由于unicode位被截断为8位

GHC 7+IO按预期工作:

Prelude> writeFile "/tmp/x" "\8730√\n"
Prelude> readFile "/tmp/x"
"\8730\8730\n"
Prelude> s <- readFile "/tmp/x"
Prelude> putStr s
√√
Prelude>writeFile”/tmp/x”“\8730√\n“
前奏曲>读取文件“/tmp/x”
“\8730\8730\n”
前奏曲>s putstrs
√√

您可以升级到GHC 7(中)以获得完全的Unicode支持吗?如果不可能,您可以使用其中一个编码库,例如

如果可以,我将升级,但是如果不可以,感谢库指针!