关于Python2中unicode的问题。
据我所知,我应该始终decode
我从外面读取的所有内容(文件,网络)。 decode
使用参数中指定的字符集将外部字节转换为内部Python字符串。所以decode("utf8")
意味着外部字节是unicode字符串,它们将被解码为python字符串。
此外,我应始终encode
我写给外面的所有内容。我在encode
函数的参数中指定编码,并将其转换为正确的编码和写入。
这些陈述是对的,不是吗?
但有时当我解析html文档时,我会得到解码错误。正如我理解其他编码中的文档(例如cp1252
)并且当我尝试使用utf8编码解码时发生错误。那么问题是如何编写防弹应用程序?
我发现有一个很好的库来猜测编码是chardet,这是编写防弹应用程序的唯一方法。正确?
答案 0 :(得分:1)
...
decode("utf8")
表示外部字节是unicode字符串,它们将被解码为python字符串。...
这些陈述是对的,不是吗?
不,外部字节是二进制数据,它们不是unicode字符串。因此,<str>.decode("utf8")
将通过将unicode
中的字节解释为UTF-8来生成Python <str>
对象;如果字节无法解码为UTF-8,则可能引发错误。
确定任何给定文档的编码不一定是一项简单的任务。您需要有一些外部信息源来告诉您编码,或者您需要了解文档中的内容。例如,如果您知道它是一个内部指定了编码的HTML文档,那么您可以使用the one outlined in the HTML Standard之类的算法解析文档以查找编码,然后使用该编码来解析文档(它是两个 - 通过操作)。但是,仅仅因为HTML文档指定了编码,并不意味着它可以使用该编码进行解码。如果数据损坏或者文档首先没有正确编码,您可能仍会收到错误。
有chardet这样的库(我看到你已经提到过)会为你尝试猜测文档的编码(这只是猜测,不一定正确) 。但是他们可能有自己的问题,如性能,他们可能无法识别文档的编码。
答案 1 :(得分:0)
尝试将您的函数包装在try:except:calls中。
使它成为一个函数,当它(如果)找到一个未被排除的编码时返回str,并在耗尽其编码列表并且引发最后一个异常时返回None或空str。
与其他人说的一样,编码应该记录在某处,所以先检查一下。
效率不高,而且坦率地说,由于我的技术水平,可能会有所偏离,但对于我的新手来说,它可能会在处理未知或未记录的编码时减轻一些问题。
答案 2 :(得分:-1)
从unicode
转换为cp437
。这样你就可以将你的字节改为unicode并返回。