在Haskell中导出Read(和Show)时,避免使用反斜杠编码utf8字符

时间:2012-09-11 20:15:50

标签: parsing haskell text encoding utf-8

在导出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的序列化邮件,但目前需要unpackString才能拨打read。我很想避免此...)

编辑:对不起,答案正确地指出show而不是read转换为"\8594" - 是否有办法{{1}并且在没有反斜杠编码的情况下再次转换回show

1 个答案:

答案 0 :(得分:4)

据我所知,Text使用的内部编码(actually UTF-16)是一致的,不会直接暴露。如果您需要UTF-8,则可以根据需要对Text值进行解码/编码。同样,谈论String的编码没有意义,因为这只是Char的列表,其中每个Char都是一个unicode代码点。

最有可能的是,Show只有Text个实例在这里以不同方式显示内容。

另外,请记住(通过标准库中的一致约定)readshow应该表现为(反)序列化函数,具有“序列化”格式,解释为一个Haskell表达式,描述了一个等价于(de)序列化的值。因此,使用ASCII文本的斜杠编码通常优选用于广泛支持和明确。如果您希望使用实际代码点显示Text值,则show不是您想要的。


我不清楚你想对Text做什么 - 直接使用show正是你想要避免的。如果要在终端窗口中显示将要指示编码的文本,并且您想要在Data.Text.IO中定义的内容。如果您出于其他原因需要转换为特定编码,Data.Text.Encoding将为您提供编码ByteString(强调“字节”,而不是“字符串” - ByteString是原始字节序列,而不是字符串)。

如果您只想将Text转换为String并返回Text ...斜杠编码有什么问题? show并不是真正打算用于阅读的漂亮打印输出,尽管许多人最初的期望不然。