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

2024-01-06

我的流程正在处理已被破坏的数据。我可以看出它已经用 UTF-8 进行了双重编码,但这只是故事的一半。双倍的-decoding仅适用于单字节(拉丁语)且完好无损地通过 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'

谁能指出我解决这个问题的正确方向?与此同时,我将继续研究这个问题,看看是否能弄清楚。


好吧,所以我基本上只需要对编码进行一些猜测,直到找到解决方案。问题在于数据也是 cp1252 编码的(可能是因为数据来自 Windows 系统)。解决办法是调用.decode('utf-8').encode('cp1252').decode('utf-8') and 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 https://gist.github.com/litchfield/1282752/653b0c1944741ac90ca9c63c25ee3c2f609b323b

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何修复 Python 中的双重编码和损坏的字符串? 的相关文章

随机推荐