繁体   English   中英

在Python中解码双重编码的utf8

[英]Decoding double encoded utf8 in Python

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

来自tcp转储的原始字符串:

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

这被转换成:

u'Rafa\xc5\x82'

我们得到的最好的是:

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

这导致正确的字符串是:

u'Rafa\u0142' 

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

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

哇,这很有趣!

>>> 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字符串,然后将其正常解码。

>>> 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'然后完全反转这个过程 - 否则我们可能会失败,如果在修复双重编码之前,会生成不同的数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM