为什么在Data.Text中解压缩和显示的方式不同(对于非ASCII字符,行为有所不同?)

时间:2013-06-01 16:34:24

标签: haskell

unpackshow是将Text转换为String的两种方法。但是,对于非ASCII字符,它们的行为和定义不同:

Prelude Data.Text> putStrLn $ unpack $ pack "你好我的朋友"
你好我的朋友
Prelude Data.Text> putStrLn $ show $ pack "你好我的朋友"
"\20320\22909\25105\30340\26379\21451"

我相信show会返回一串代码点,而unpack会显示实际的字符。我在编码时发现这是一个令人讨厌的问题,因为我定义了一个Show实例并希望传入Text的函数,并期望它将实际的非ASCII字符作为{返回} {1}}。

此行为的设计意图是什么?为什么Stringshow定义不同?

可以在http://hackage.haskell.org/packages/archive/text/0.11.1.5/doc/html/src/Data-Text.html找到来源。

1 个答案:

答案 0 :(得分:7)

这是关于Show的一般情况:它的目的是产生一种预览对象,可以兼作便携式序列化,可读 as Haskell代码。显然,你好我的朋友 不是有效的Haskell(除非你将它定义为变量,实际上是can!),所以它不能作为{{1的输出}}。如果它生成show(实际上我更喜欢这样)会很好,但如果你并没有在你的所有工作链中使用完整的UTF-8,这可能会导致平台等问题,因此选择了更安全的ASCII扩展。

如果你想要漂亮的非转义普通字符串输出作为GHCi回声,你可以使用the new custom-pretty-printer feature。我已经写了一些关于here的内容。