我无法让 GHCi 或 GHC 打印 unicode 代码点 221A(平方符号:√)。
我不认为这是我的外壳,因为我可以让 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 的行为GHC 6.12.1 中更改 http://ghcmutterings.wordpress.com/2009/09/30/heads-up-what-you-need-to-know-about-unicode-io-in-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(在哈斯克尔平台 http://haskell.org/platform)以获得完整的 Unicode 支持?如果这是不可能的,您可以使用编码库之一,例如utf8 字符串 http://hackage.haskell.org/package/utf8-string
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)