如果xmlcharrefreplace和backslashreplace不起作用,我应该如何解码字节(使用ASCII)而不丢失任何“垃圾”字节?

2024-05-16 05:15:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个网络资源,它返回的数据应该(根据规范)是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'

这是一个人为的例子。我的目标是不丢失任何数据。如果我使用ignorereplace错误处理程序,相关字节基本上会消失,信息也会丢失。在


Tags: 数据字符串规范处理程序data错误ascii资源
2条回答

为了完整起见,希望添加到python3.5起,backslashreplace可以进行解码,因此不再需要添加自定义错误处理程序。在

>>> data = b'\xd3PS-90AC'
>>> data.decode('ascii', 'surrogateescape')
'\udcd3PS-90AC'

它不使用html实体,但这是一个不错的起点。如果还不够,您将不得不使用codecs.register_error注册自己的错误处理程序。在

对于Python3:

^{pr2}$

对于Python 2

def handler(err):
    start = err.start
    end = err.end
    return (u"".join([u"&#{0};".format(ord(err.object[i])) for i in range(start,end)]),end)

import codecs
codecs.register_error('xmlcharreffallback', handler)
data = b'\xd3PS-90AC'
data.decode('ascii', 'xmlcharreffallback')

两者都产生:

'ÓPS-90AC'

相关问题 更多 >