【发布时间】:2014-08-22 08:43:51
【问题描述】:
我有一个网络资源,它返回的数据应该(根据规范)是一个 ASCII 编码的字符串。但在极少数情况下,我会收到垃圾数据。
例如,一个资源返回b'\xd3PS-90AC',而另一个资源,对于相同的键返回b'PS-90AC'
第一个值包含一个非 ASCII 字符串。显然违反了规范,但不幸的是我无法控制。我们没有人能 100% 确定这真的是是垃圾或应该保留的数据。
调用远程资源的应用程序将数据保存在本地数据库中以供日常使用。我可以简单地做一个data.decode('ascii', 'replace') 或..., 'ignore'),但是我会丢失数据,这些数据可能会在以后变得有用。
我的第一反应是使用'xmlcharrefreplace' 或'backslashreplace' 作为错误处理程序。仅仅是因为它会产生一个可显示的字符串。但后来我收到以下错误:TypeError: don't know how to handle UnicodeDecodeError in error callback
唯一有效的错误处理程序是surrogateescape,但这似乎是为文件名设计的。另一方面,出于我的意图和目的,它会起作用。
为什么'xmlcharrefreplace' 和'backslashreplace' 不起作用?我不明白这个错误。
对于示例,预期的执行是:
>>> data = b'\xd3PS-90AC'
>>> new_data = data.decode('ascii', 'xmlcharrefreplace')
>>> print(repr(new_data))
'&#d3;PS-90AC'
这是一个人为的示例。我的目标是不丢失任何数据。如果我使用ignore 或replace 错误处理程序,则相关字节基本上会消失,并且信息会丢失。
【问题讨论】:
-
我不清楚预期的“输出”是什么。你想要“ASCII”字符串和“垃圾”字节一起(比如
u'\u00d3PS-90AC')?或者类似于data.decode('unicode_escape')的结果? -
我添加了一些示例执行。并不是说示例输出有点出自我的脑海。如果它使用不同的语法,那没关系。
-
我添加了标签 Python3,因为您的示例暗示了这一点。还是我错了?
-
没关系 ;) 因为
surrogateescape和backslashreplace仅存在于 Python3 中。目前我正在编写的库仍在由 one Python 2 应用程序使用,因此首选 Python2 解决方案,但我们计划最终将剩下的一个应用程序移植到 Python3。所以没关系...最坏的情况,我们必须现在移植它 :)
标签: python python-3.x encoding byte