Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python编码的防弹工作_Python_Unicode_Encoding - Fatal编程技术网

用Python编码的防弹工作

用Python编码的防弹工作,python,unicode,encoding,Python,Unicode,Encoding,Python2中关于unicode的问题 就我所知,我应该总是解码我从外部读取的所有内容(文件、网络)解码使用参数中指定的字符集将外部字节转换为内部Python字符串。所以decode(“utf8”)意味着外部字节是unicode字符串,它们将被解码为python字符串 此外,我应该总是对我在外面写的东西进行编码。我在encode函数的参数中指定编码,它将转换为正确的编码和写入 这些说法是对的,不是吗 但有时当我解析html文档时,会出现解码错误。据我所知,该文档采用其他编码(例如cp1252)

Python2中关于unicode的问题

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

此外,我应该总是对我在外面写的东西进行编码。我在
encode
函数的参数中指定编码,它将转换为正确的编码和写入

这些说法是对的,不是吗

但有时当我解析html文档时,会出现解码错误。据我所知,该文档采用其他编码(例如
cp1252
),当我尝试使用utf8编码对其进行解码时,会发生错误。所以问题是如何编写防弹应用程序

我发现有很好的库可以猜测编码是什么,这是编写防弹应用程序的唯一方法。对吧?

decode(“utf8”)
表示外部字节是unicode字符串,它们将被解码为python字符串

这些说法是对的,不是吗

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

确定任何给定文档的编码不一定是一项简单的任务。您要么需要一些外部信息源来告诉您编码,要么需要了解文档中的内容。例如,如果您知道它是一个内部指定了编码的HTML文档,那么您可以使用类似于查找编码的算法来解析该文档,然后使用该编码来解析该文档(这是一个两次传递操作)。然而,仅仅因为HTML文档指定了一种编码,并不意味着它可以用这种编码进行解码。如果数据已损坏或文档未正确编码,则仍然可能会出现错误


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

尝试将函数包装在Try:except:calls中

  • 尝试以utf-8解码:
  • 捕获异常(如果不是utf-8):
  • 如果引发异常,请尝试下一次编码:
  • 等等,等等
使其成为一个函数,当(和如果)它发现一个未被排除的编码时返回str,当它用尽其编码列表并引发最后一个异常时返回None或空str

就像其他人说的,编码应该记录在某个地方,所以首先检查一下


效率不高,坦率地说,由于我的技能水平,这可能是远远不够的,但在我的新手看来,这可能会缓解一些处理未知或未记录编码时的问题

cp437
转换为
unicode
。通过这种方式,您可以将字节直接输入到unicode并返回。

文档通常会在某个地方附带一条编码语句。如果您没有编码,或者所述编码错误,您可能会遇到不可避免的错误。你最好能用一些策略来处理错误,并产生一个可能有点像你想要的结果。我发现Python中编码问题的最佳概述如下:此外,在你的帖子中有一个小小的误解:«decode»函数将始终为你提供Unicode。我同意前面的评论,即:首先依赖字符集声明。真的没有“防弹”的方法来处理错误编码的文档。我也能帮上忙。这一个得到我的选票;但可能需要强调的是,
chardet
是一个启发式猜测器,它不会试图验证它报告的结果是否有效——您需要准备解码错误,可能会退回到第二个最佳猜测,或者干脆放弃(例如,配置错误的web服务器可能会为您提供大量JPEG字节,而这些字节根本没有语言)。如果您-1,请说明您是否需要解释为什么
cp437
。如果您只是因为
unicode
很流行而不喜欢
cp437
,那就没办法了。