使用Python编码的防弹工作

时间:2013-12-03 10:20:13

标签: python unicode encoding

关于Python2中unicode的问题。

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

此外,我应始终encode我写给外面的所有内容。我在encode函数的参数中指定编码,并将其转换为正确的编码和写入。

这些陈述是对的,不是吗?

但有时当我解析html文档时,我会得到解码错误。正如我理解其他编码中的文档(例如cp1252)并且当我尝试使用utf8编码解码时发生错误。那么问题是如何编写防弹应用程序?

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

3 个答案:

答案 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中。

  • 尝试解码为utf-8:
  • 如果不是utf-8,则捕获异常:
  • 如果出现异常,请尝试下一个编码:
  • 等等...

使它成为一个函数,当它(如果)找到一个未被排除的编码时返回str,并在耗尽其编码列表并且引发最后一个异常时返回None或空str。

与其他人说的一样,编码应该记录在某处,所以先检查一下。

效率不高,而且坦率地说,由于我的技术水平,可能会有所偏离,但对于我的新手来说,它可能会在处理未知或未记录的编码时减轻一些问题。

答案 2 :(得分:-1)

unicode转换为cp437。这样你就可以将你的字节改为unicode并返回。