gpt4 book ai didi

haskell - 文本编码问题

转载 作者:行者123 更新时间:2023-12-02 16:03:27 25 4
gpt4 key购买 nike

我在文本编码方面遇到了一些问题。解析网站给我一个 Data.Text 字符串

"Project - Fran\195\167ois Dubois",

我需要将其写入文件。所以我使用 Data.Text.Lazy.Encoding.encodeUtf8 将其转换为字节字符串。问题是这会产生乱码输出:

"Project - François Dubois".

我在这里缺少什么?

最佳答案

如果您在 Data.Text 中获得了 Fran\195\167ois,则您已经拥有了 UTF-8 编码的 François

这很不方便,因为 Data.Text[.Lazy] 应该是 UTF-16 编码文本,并且两个代码单元 195 和 167 分别被解释为 unicode 代码点 195。 167 分别是“à”。 '§'。如果您对文本进行 UTF-8 编码,它们将转换为字节序列 c383 ([195,131])c2a7 ([194,167])

出现这种情况的最可能的方法是,您从网站获取的数据是 UTF-8 编码的,但被解释为 ISO-8859-1 (Latin 1) 编码(或其他 8 位编码;8859 -15 也很普遍)。

正确的处理方法是完全避免这种情况[不幸的是,这可能是不可能的]。

如果数据源正确地说明了其编码(网站应该如此),找出编码并相应地解释数据。如果指定了不正确的编码,那么您当然不走运,如果没有指定编码,您必须猜测正确(现在自然猜测是 UTF-8,至少对于使用拉丁字母变体的语言而言)。

<小时/>

如果无法避免这种情况,最简单的解决方法是

  1. 在编码之前将出现的有问题的序列替换为所需的序列:

    encodeUtf8 $ replace (pack "Fran\195\167ois") (pack "Fran\231ois") contents
  2. 假设其他所有内容都是 ASCII 或无意的 UTF-8,则将 Text 代码单元解释为字节:

    Data.ByteString.Lazy.Char8.pack $ Data.Text.Lazy.unpack contents

前者更有效,但如果存在许多不同的错误编码(例如,由不同的重音字母引起),就会变得不方便。后者仅在假设情况下有效(Text 中没有超过 255 的代码单元),并且对于长文本效率相当低。

关于haskell - 文本编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10060519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com