在Python中解码双重编码的UTF-8
我遇到了一个问题,涉及到我从一个客户那里通过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 个回答
>>> 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'
的,然后再准确地反向操作这个过程——否则如果在双重编码问题解决之前出现不同的数据,我们可能会遇到麻烦。
哇,真有趣!
>>> 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字符串,然后再像往常一样进行解码。
当然可以!请看下面的内容:
在编程中,有时候我们需要让程序在特定的条件下执行某些操作。这就像给程序设定了一些规则,只有当这些规则被满足时,程序才会做出反应。
例如,假设你在写一个游戏,你希望当玩家的分数达到100分时,游戏就会显示“你赢了!”的消息。这就是一个条件判断的例子。程序会检查玩家的分数,如果分数是100或更高,程序就会执行显示消息的操作。
这种条件判断通常用“如果”这个词来表示。在编程中,我们会用“if”这个关键词来写出这样的规则。这样,程序就能根据不同的情况做出不同的反应。
希望这个解释能帮助你更好地理解条件判断的概念!
>>> s = u'Rafa\xc5\x82' >>> s.encode('raw_unicode_escape').decode('utf-8') u'Rafa\u0142' >>>