【问题标题】:How to fix double-encoded and mangled strings in Python?如何修复 Python 中的双重编码和损坏的字符串?
【发布时间】:2018-04-27 16:23:18
【问题描述】:

我的流程正在处理已损坏的数据。我可以说它已经在 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'

谁能指出我解决这个问题的正确方向?在此期间,我将继续探讨这个问题,看看我是否能弄清楚。

【问题讨论】:

    标签: python python-2.7 python-unicode


    【解决方案1】:

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

    >>> 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

    【讨论】:

      猜你喜欢
      • 2014-12-16
      • 2012-11-05
      • 2013-10-19
      • 1970-01-01
      • 2010-11-23
      • 2015-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多