unpack
和show
是将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 字符作为 String
。
此行为的设计意图是什么?为什么 show
和 unpack
的定义不同?
来源可以在 http://hackage.haskell.org/packages/archive/text/0.11.1.5/doc/html/src/Data-Text.html 找到.
最佳答案
这是关于 Show
的通用内容:它的目的是生成一种对象的预览,可以兼作可移植序列化,可读性如 Haskell代码。显然,你好我的 friend
不是有效的 Haskell(除非你将它定义为一个变量,实际上你是 can !),所以它不会被接受为show
的输出。如果它产生 "你好我的 friend "
就好了(事实上,我更喜欢那样),但是当你没有完全使用完整的 UTF 时,这可能会导致平台等问题- 8 在您的所有工作链中,因此选择了更安全的 ASCII 扩展。
如果你想要良好的非转义纯字符串输出作为 GHCi 回显,你可以使用 the new custom-pretty-printer feature .我已经写了一些关于那个的东西 here .
关于haskell - 为什么 unpack 和 show 在 Data.Text 中的定义不同(对于非 ASCII 字符的行为也不同?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16874812/