在 Haskell 中导出读取(和显示)时避免反斜杠编码 utf8 字符

Reh*_*que 2 encoding parsing text haskell utf-8

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

> import Data.Text
> data Message = Message Text deriving (Read, Show)
> read ("Message \"?\"") :: Message
Message "\8594"
Run Code Online (Sandbox Code Playgroud)

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

Message "?"
Run Code Online (Sandbox Code Playgroud)

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

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

C. *_*ann 5

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

最有可能的是,这只是在这里ShowText不同方式显示事物的实例。

另外,请记住,(按照标准库中的一致约定)readshow预期作为(反)序列化函数,具有“序列化”格式,解释为 Haskell 表达式,描述的值相当于(反)序列化。因此,使用 ASCII 文本的斜线编码通常是首选,因为它被广泛支持和明确。如果您想显示Text具有实际代码点的值,这show不是您想要的。


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

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