我有一个网络资源,它返回的数据应该(根据规范)是ASCII编码的字符串。但在一些罕见的情况下,我会得到垃圾数据。在
例如,一个资源返回b'\xd3PS-90AC'
,而另一个资源对于同一个键返回b'PS-90AC'
第一个值包含非ASCII字符串。显然违反了规范,但不幸的是我无法控制。我们中没有人百分之百地肯定这真的是垃圾或者应该保留的数据。在
调用远程资源的应用程序将数据保存在本地数据库中以供日常使用。我可以简单地做一个data.decode('ascii', 'replace')
或..., 'ignore')
,但这样我就会丢失以后可能有用的数据。在
我的直接反应是使用'xmlcharrefreplace'
或{TypeError: don't know how to handle UnicodeDecodeError in error callback
唯一有效的错误处理程序是surrogateescape
,但这似乎是针对文件名的。另一方面,对于我的意图和目的,它会起作用。在
为什么'xmlcharrefreplace'
和{
对于示例,预期的执行将是:
>>> data = b'\xd3PS-90AC'
>>> new_data = data.decode('ascii', 'xmlcharrefreplace')
>>> print(repr(new_data))
'&#d3;PS-90AC'
这是一个人为的例子。我的目标是不丢失任何数据。如果我使用ignore
或replace
错误处理程序,相关字节基本上会消失,信息也会丢失。在
为了完整起见,希望添加到python3.5起,
backslashreplace
可以进行解码,因此不再需要添加自定义错误处理程序。在它不使用html实体,但这是一个不错的起点。如果还不够,您将不得不使用codecs.register_error注册自己的错误处理程序。在
对于Python3:
^{pr2}$对于Python 2
两者都产生:
相关问题 更多 >
编程相关推荐