关于Python2中unicode的问题。
据我所知,我应该始终decode
从外部(文件,网络)读取所有内容。decode
使用参数中指定的字符集将外部字节转换为内部 Python 字符串。因此decode("utf8")
意味着外部字节是 unicode 字符串,它们将被解码为 python 字符串。
而且我应该总是把encode
我写的所有东西都写到外面。我在encode
函数参数中指定编码,并将其转换为正确的编码并写入。
这些说法是对的,不是吗?
但有时当我解析 html 文档时,我会遇到解码错误。据我了解其他编码(例如cp1252
)的文档,当我尝试使用 utf8 编码对其进行解码时会发生错误。那么问题来了,如何编写防弹应用程序呢?
我发现有一个很好的库来猜测编码是chardet,这是编写防弹应用程序的唯一方法。正确的?
...
decode("utf8")
意味着外部字节是 unicode 字符串,它们将被解码为 python 字符串。...
这些说法是对的,不是吗?
不,外部字节是二进制数据,它们不是 unicode 字符串。因此将通过将字节解释为UTF-8来<str>.decode("utf8")
生成一个 Python对象;如果字节无法解码为 UTF-8,则可能会引发错误。unicode
<str>
确定任何给定文档的编码不一定是一项简单的任务。您要么需要一些外部信息源来告诉您编码,要么需要了解文档中的内容。例如,如果您知道它是一个内部指定了编码的 HTML 文档,那么您可以使用HTML 标准中概述的算法来解析该文档,以查找编码,然后使用该编码来解析该文档(它是两遍操作)。然而,仅仅因为 HTML 文档指定了编码,并不意味着它可以用该编码进行解码。如果数据损坏或文档最初编码不正确,您仍然可能会收到错误。
有一些库,例如chardet(我看到你已经提到过),会尝试为你猜测文档的编码(这只是猜测,不一定正确)。但他们可能有自己的问题,例如性能,并且他们可能无法识别您文档的编码。