3

unpack并且show是两种转换TextString. 但是,对于非 ASCII 字符,它们的行为和定义不同:

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

我相信,使用会show返回一串代码点,同时unpack显示实际字符。我发现这在编码时很麻烦,因为我已经定义了接受一个Show实例并想要传入的函数Text,并期望它将实际的非 ASCII 字符作为String.

这种行为的设计意图是什么?为什么showunpack定义不同?

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

4

1 回答 1

7

这是一个普遍的事情Show:它的目的是产生一种对象的预览,可以兼作可移植的序列化,像 Haskell 代码一样可读。显然,你好我的朋友不是有效的Haskell(除非您将其定义为变量,您实际上可以这样做!),因此它不能作为show. 如果它产生"你好我的朋友"(事实上,我更愿意),那会很好,但是当您没有在所有工作链中完全使用完整的 UTF-8 时,这可能会导致平台等问题,因此更安全地扩展为 ASCII被选中。

如果您想要漂亮的非转义纯字符串输出作为 GHCi 回显,您可以使用新的 custom-pretty-printer 功能。我已经在这里写了一些关于它的东西

于 2013-06-01T17:03:19.177 回答