【问题标题】:GHC truncating Unicode character outputGHC 截断 Unicode 字符输出
【发布时间】:2011-08-05 01:28:02
【问题描述】:

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

我不认为这是我的外壳,因为我可以得到 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)

【问题讨论】:

    标签: unicode haskell ghc


    【解决方案1】:

    GHC 使用 unicode changed 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(在 Haskell Platform 中)以获得完整的 Unicode 支持?如果这不可行,您可以使用其中一种编码库,例如utf8-string

    【讨论】:

    • 如果可以,我会升级,但如果不能,感谢库指针!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多