GHC: 显示Unicode字符

4

关于在制作.exe文件时Unicode字符的管理问题,这是否也是GHC中的一个错误?

> print "Frère"
"Fr\233re"
2个回答

12

print x 相当于 putStrLn (show x),其中 show 将实现了 Show 类的类型转换为字符串表示形式。

在你的情况下,x 已经具有 String 类型。你可能会认为 show 的 String 实现只会简单地返回其参数不变,但实际上它将其转换为一个 ASCII 字符串文字标记,其语法与 Haskell 源代码中使用的相同。这是通过用引号括起来并转义“特殊”字符(基本上是不在键盘上的任何东西)来完成的。

因此,这不是一个 bug 而是 print 的预期行为。如果想直接输出字符串,请使用 putStrLn


我刚被这个问题咬了一口。我猜由于遗留原因,“show”执行了它的功能,但在REPL中,当Unicode字符串未按预期显示时,它肯定没有帮助! - FranklinChen
有没有替代show的方法,可以处理Unicode而不将其转换为ASCII? - martinkunev

1

尝试

> putStrLn "Frère"
Frère      

2
如果你使用的是Windows系统,你可能会得到"Frère"这个词,但是根据字符、代码页(是的,代码页)和月相等因素,你也可能会得到"*** Exception: <stdout>: hPutChar: invalid argument (invalid character)"这个错误。这真的很让人烦恼。 - n. m.
@n.m. 这就是为什么我几乎所有旨在在Windows上运行的Haskell程序都以涉及mkTextEncoding"//TRANSLIT"的内容开头。 - Jeremy List
1
@JeremyList //TRANSLIT真的非常烦人。GHCi完全能够在控制台显示每个Unicode字符;为什么我的程序必须绕过一些麻烦,才能避免在遇到一个重音字母时崩溃?它是不是默认与GHCi使用的相同库链接在一起的呢? - n. m.
是的,这实际上是一个 bug(计划在 GHC 7.12.1 中修复)。GHCi 通过捕获异常而不是使用不同的库来防止此问题。 - Jeremy List

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接