在Python中解码双重编码的utf8

时间:2009-07-24 12:23:26

标签: python string utf-8 decode

我遇到的问题是我通过xmlrpc从我的一个客户端获得的字符串。他向我发送了两次编码的utf8字符串:(所以当我在python中得到它们时,我有一个unicode对象,必须再次解码,但很明显python不允许这样做。我注意到了我的客户端但是我需要在修复它之前,现在就做快速的解决方法。

来自tcp dump的原始字符串:

<string>Rafa\xc3\x85\xc2\x82</string>

这转换为:

u'Rafa\xc5\x82'

我们得到的最好的是:

eval(repr(u'Rafa\xc5\x82')[1:]).decode("utf8") 

这会产生正确的字符串:

u'Rafa\u0142' 

然而这种作品很难看,并且无法在生产代码中使用。 如果有人知道如何以更合适的方式解决这个问题,请写信。 谢谢, 克里斯

3 个答案:

答案 0 :(得分:44)

>>> s = u'Rafa\xc5\x82'
>>> s.encode('raw_unicode_escape').decode('utf-8')
u'Rafa\u0142'
>>>

答案 1 :(得分:3)

对,这很有趣!

>>> original = "Rafa\xc3\x85\xc2\x82"
>>> first_decode = original.decode('utf-8')
>>> as_chars = ''.join([chr(ord(x)) for x in first_decode])
>>> result = as_chars.decode('utf-8')
>>> result
u'Rafa\u0142'

所以你做第一次解码,得到一个Unicode字符串,其中每个字符实际上是一个UTF-8字节值。您可以通过每个字符的整数值返回到真正的UTF-8字符串,然后将其正常解码。

答案 2 :(得分:2)

>>> weird = u'Rafa\xc5\x82'
>>> weird.encode('latin1').decode('utf8')
u'Rafa\u0142'
>>>

latin1只是Richie's nuts'n'bolts方法的缩写。

非常奇怪的是,严重欠描述的raw_unicode_escape编解码器在这种情况下给出了与latin1相同的结果。他们总是给出相同的结果吗?如果是这样,为什么要有这样的编解码器?如果没有,最好确切地知道OP的客户是如何完成从'Rafa\xc5\x82'u'Rafa\xc5\x82'的转换然后完全反转该过程 - 否则如果不同的数据在之前出现,我们可能会失败双重编码是固定的。