解码Python中的双编码UTF8(Decoding double encoded utf8 in

2019-06-26 16:34发布

我有一个问题,用绳子,我从我的客户在XMLRPC的一赠。 他送我进行两次编码UTF8字符串:(所以当我在python让他们我有了更多的时间进行解码的unicode的对象,但显然蟒蛇不允许。但是我注意到我的客户,我需要到现在他修复它之前做快速的解决方法。

从TCP转储原始字符串:

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

此被转换成:

u'Rafa\xc5\x82'

我们得到的最好的是:

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

这导致正确的字符串是:

u'Rafa\u0142' 

这个工程是不过丑得要命,并且不能在生产代码中使用。 如果有人知道如何以更合适的方式解决这个问题,请写信。 谢谢,克里斯

Answer 1:

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


Answer 2:

佑,这很有趣!

>>> 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字符串,然后您可以解码为正常。



Answer 3:

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

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

这是非常奇怪的是严重不足的描述raw_unicode_escape编解码器给出了相同的结果latin1在这种情况下。 他们总是给出相同的结果? 如果是这样,为什么有这样的编解码器? 如果没有,那就最好确切知道OP的客户究竟是如何做到从改造'Rafa\xc5\x82'u'Rafa\xc5\x82' ,然后准确地扭转这一过程-否则,我们可能会脱胶如果双编码被固定之前不同的数据作物起来。



文章来源: Decoding double encoded utf8 in Python