2

Text在派生Read实例时无法解析 utf8 字符。例如,当我在ghci中运行以下命令时...

> import Data.Text
> data Message = Message Text deriving (Read, Show)
> read ("Message \"→\"") :: Message
Message "\8594"

我可以做些什么来将我的文本保存在Messageutf-8 编码中吗?即结果应该是...

Message "→"

(PS 我已经收到我的序列化消息Text,但目前需要unpack一个String才能调用read。我很想避免这种情况......)

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

4

1 回答 1

5

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

最有可能的是,这只是此处以不同方式显示事物的Show实例。Text

另外,请记住(按照标准库中的一致约定)read并且show应该表现为(反)序列化函数,具有“序列化”格式,解释为 Haskell 表达式,描述一个与以下值等效的值(反)序列化。因此,使用 ASCII 文本的斜线编码通常是首选,因为它被广泛支持和明确。如果你想Text用实际的代码点显示一个值,那show不是你想要的。


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

如果你只是想从TexttoString和 back to转换Text……斜线编码有什么问题?show尽管许多人最初的期望并非如此,但它并不是真正用于供用户阅读的漂亮打印输出。

于 2012-09-11T20:25:00.020 回答