我遇到的问题是我通过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'
然而这种作品很难看,并且无法在生产代码中使用。 如果有人知道如何以更合适的方式解决这个问题,请写信。 谢谢, 克里斯
答案 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'
的转换然后完全反转该过程 - 否则如果不同的数据在之前出现,我们可能会失败双重编码是固定的。