如何在Python中修复双重编码和损坏的字符串?

时间:2018-04-27 16:23:18

标签: python python-2.7 python-unicode

我的流程正在处理已被破坏的数据。我可以说它在UTF-8中已被双重编码,但这只是故事的一半。双解码仅适用于单字节(拉丁语)的代码点,并且无损坏地通过UTF-8。不能使用.decode('utf-8').encode('raw_unicode_escape').decode('utf-8')

对双字节(或更大)代码点进行双重解码

我有一个例子可以帮助我解决这个问题。我遇到的一个问题是:

'\xc3\x82\xc2\xa9\xc3\x82\xc2\xae\xc3\xa2\xe2\x80\x9e\xc2\xa2'

这应该解决:

u'\xa9\xae\u2122'

(c)和(r)符号的前两个代码点不需要代理对,因此非常明显地存在于原始字节中。但是,最后一个字符(tm)符号是一个16位代码点,并且无论这个过程如何都会受到损坏。

如果我在那之前切断了字符串,那么我可以成功地进行双重解码:

'\xc3\x82\xc2\xa9\xc3\x82\xc2\xae'.decode('utf-8').encode('raw_unicode_escape').decode('utf-8')

但是,这不适用于整个字符串,因为第一次解码会产生以下结果:

u'\xc2\xa9\xc2\xae\xe2\u201e\xa2'

有人能指出我解决这个问题的正确方向吗?在此期间我会继续探讨这个问题,看看能不能解决这个问题。

1 个答案:

答案 0 :(得分:1)

好吧,所以我基本上只需要对编码做出一些猜测,直到我想出解决方案。问题是数据也是cp1252编码(可能是因为数据来自Windows系统)。解决方案是调用.decode('utf-8').encode('cp1252').decode('utf-8') voila

>>> raw = '\xc3\x82\xc2\xa9\xc3\x82\xc2\xae\xc3\xa2\xe2\x80\x9e\xc2\xa2'
>>> print raw.decode('utf-8').encode('cp1252').decode('utf-8')
©®™

我希望别人可以通过这个来获得帮助!

发现这也有帮助:

https://gist.github.com/litchfield/1282752/653b0c1944741ac90ca9c63c25ee3c2f609b323b