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