在Python中解码双重编码的UTF-8

24 投票
3 回答
18629 浏览
提问于 2025-04-15 13:08

我遇到了一个问题,涉及到我从一个客户那里通过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' 

虽然这个方法有效,但看起来非常丑陋,不能在生产代码中使用。如果有人知道更合适的解决办法,请告诉我。谢谢,Chris

3 个回答

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

latin1其实就是Richie的一个简单方法的简称。

很奇怪的是,那个描述得很少的raw_unicode_escape编码在这种情况下和latin1的结果是一样的。它们总是会给出相同的结果吗?如果是这样,那为什么还要有这样的编码呢?如果不是,那我们最好能确切知道提问者的客户端是怎么把'Rafa\xc5\x82'转换成u'Rafa\xc5\x82'的,然后再准确地反向操作这个过程——否则如果在双重编码问题解决之前出现不同的数据,我们可能会遇到麻烦。

4

哇,真有趣!

>>> 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字符串,然后再像往常一样进行解码。

47

当然可以!请看下面的内容:

在编程中,有时候我们需要让程序在特定的条件下执行某些操作。这就像给程序设定了一些规则,只有当这些规则被满足时,程序才会做出反应。

例如,假设你在写一个游戏,你希望当玩家的分数达到100分时,游戏就会显示“你赢了!”的消息。这就是一个条件判断的例子。程序会检查玩家的分数,如果分数是100或更高,程序就会执行显示消息的操作。

这种条件判断通常用“如果”这个词来表示。在编程中,我们会用“if”这个关键词来写出这样的规则。这样,程序就能根据不同的情况做出不同的反应。

希望这个解释能帮助你更好地理解条件判断的概念!

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

撰写回答