我在文字编码方面有点麻烦。解析网站会给我一个Data.Text字符串
“Fran\195\167 195项目”,
我需要把它写到文件里。因此,我使用Data.Text.Lazy.Encoding.encodeUtf8将其转换为字节串。问题是,这会产生错误的输出:
“项目-Fran§ois Dubois”。
我在这里错过了什么?
发布于 2012-04-08 02:05:17
如果你在你的Fran\195\167ois
中得到了Data.Text
,你已经有了一个UTF-8编码的François
.
这是不方便的,因为Data.Text[.Lazy]
应该是UTF-16编码文本,而这两个代码单元195和167被解释为unicode代码点195 resp。167,即“圣保罗”。“§”。如果您对文本进行UTF-8编码,这些将转换为字节序列c383 ([195,131])
resp c2a7 ([194,167])
.
进入这种情况最有可能的方法是,您从网站获得的数据是UTF-8编码,但被解释为ISO-8859-1 (拉丁文1)编码(或另一个8位编码;8859-15也很普遍)。
处理这一问题的适当办法是完全避免可能不可能发生的情况,不幸的是。
如果你的数据来源正确地说明了它的编码--就像网站应该做的那样--找出编码并对数据进行相应的解释。如果一个不正确的编码被指出,你当然是运气不好,如果没有指定编码,你必须猜对了(现在的自然猜测是UTF-8,至少对于使用拉丁字母变体的语言来说是这样)。
如果不可能避免这种情况,最简单的解决方法是
Text
代码单元解释为字节:
Data.ByteString.Lazy.Char8.pack $ Data.Text.Lazy.unpack内容前者效率更高,但如果有许多不同的错误编码(例如,由不同的重音字母引起),则会变得不方便。后者只在假设的情况下工作(Text
中没有255个以上的代码单元),对于长文本来说效率很低。
发布于 2012-04-07 22:22:26
我不完全确定less
是否能正确显示UTF-8编码的字符.GVim可以。您可以检查这链接,以便了解如何在gVim中查看UTF-8数据。
关于能够将它传递给graphviz的另一个问题,我认为您需要在命令行上设置编码,正如图NonAscii常见问题中所解释的那样。
根据您正在解释的内容,我认为数据是如何持久化的没有问题。如果您正确地将编码传递给graphviz,我认为您的问题将得到解决。
P.S:创建一个答案,因为创建描述性链接更容易
https://stackoverflow.com/questions/10060519
复制相似问题