GHC截断Unicode字符输出

| 我无法获得GHCi或GHC来打印Unicode代码点221A(sqrt符号:√)。 我不认为这是我的壳,因为我可以得到红宝石来做到这一点:
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行为在GHC 6.12.1中更改为使用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
√√
您可以升级到GHC 7(在Haskell平台中)以获得完整的Unicode支持吗?如果这不可能,则可以使用其中一种编码库,例如utf8-string     

要回复问题请先登录注册