【发布时间】: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