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找到源代码。