在导出Text
实例时,我无法将utf8字符解析为Read
。例如,当我在 ghci ...
> import Data.Text
> data Message = Message Text deriving (Read, Show)
> read ("Message \"→\"") :: Message
Message "\8594"
我可以做任何事情来保持我的文字在Message
utf-8编码内吗?即结果应该是......
Message "→"
(PS我已经收到Text
的序列化邮件,但目前需要unpack
到String
才能拨打read
。我很想避免此...)
编辑:对不起,答案正确地指出show
而不是read
转换为"\8594"
- 是否有办法{{1}并且在没有反斜杠编码的情况下再次转换回show
?
答案 0 :(得分:4)
据我所知,Text
使用的内部编码(actually UTF-16)是一致的,不会直接暴露。如果您需要UTF-8,则可以根据需要对Text
值进行解码/编码。同样,谈论String
的编码没有意义,因为这只是Char
的列表,其中每个Char
都是一个unicode代码点。
最有可能的是,Show
只有Text
个实例在这里以不同方式显示内容。
另外,请记住(通过标准库中的一致约定)read
和show
应该表现为(反)序列化函数,具有“序列化”格式,解释为一个Haskell表达式,描述了一个等价于(de)序列化的值。因此,使用ASCII文本的斜杠编码通常优选用于广泛支持和明确。如果您希望使用实际代码点显示Text
值,则show
不是您想要的。
我不清楚你想对Text
做什么 - 直接使用show
正是你想要避免的。如果要在终端窗口中显示将要指示编码的文本,并且您想要在Data.Text.IO
中定义的内容。如果您出于其他原因需要转换为特定编码,Data.Text.Encoding
将为您提供编码ByteString
(强调“字节”,而不是“字符串” - ByteString
是原始字节序列,而不是字符串)。
如果您只想将Text
转换为String
并返回Text
...斜杠编码有什么问题? show
并不是真正打算用于阅读的漂亮打印输出,尽管许多人最初的期望不然。