Bulletproof 使用 Python 进行编码

5 python unicode encoding

关于Python2中unicode的问题。

据我所知,我应该始终decode从外部(文件,网络)读取所有内容。decode使用参数中指定的字符集将外部字节转换为内部 Python 字符串。因此decode("utf8")意味着外部字节是 unicode 字符串,它们将被解码为 python 字符串。

而且我应该总是把encode我写的所有东西都写到外面。我在encode函数参数中指定编码,并将其转换为正确的编码并写入。

这些说法是对的,不是吗?

但有时当我解析 html 文档时,我会遇到解码错误。据我了解其他编码(例如cp1252)的文档,当我尝试使用 utf8 编码对其进行解码时会发生错误。那么问题来了,如何编写防弹应用程序呢?

我发现有一个很好的库来猜测编码是chardet,这是编写防弹应用程序的唯一方法。正确的?

mil*_*dev 1

...decode("utf8")意味着外部字节是 unicode 字符串,它们将被解码为 python 字符串。

...

这些说法是对的,不是吗?

不,外部字节是二进制数据,它们不是 unicode 字符串。因此将通过将字节解释为UTF-8来<str>.decode("utf8")生成一个 Python对象;如果字节无法解码为 UTF-8,则可能会引发错误。unicode<str>

确定任何给定文档的编码不一定是一项简单的任务。您要么需要一些外部信息源来告诉您编码,要么需要了解文档中的内容。例如,如果您知道它是一个内部指定了编码的 HTML 文档,那么您可以使用HTML 标准中概述的算法来解析该文档,以查找编码,然后使用该编码来解析该文档(它是两遍操作)。然而,仅仅因为 HTML 文档指定了编码,并不意味着它可以用该编码进行解码。如果数据损坏或文档最初编码不正确,您仍然可能会收到错误。

有一些库,例如chardet(我看到你已经提到过),会尝试为你猜测文档的编码(这只是猜测,不一定正确)。但他们可能有自己的问题,例如性能,并且他们可能无法识别您文档的编码。