24

我从我的一个客户通过 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' 

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

4

3 回答 3

46
>>> s = u'拉法\xc5\x82'
>>> s.encode('raw_unicode_escape').decode('utf-8')
u'拉法\u0142'
>>>
于 2009-07-24T13:11:26.970 回答
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 字符串,然后您可以正常解码。

于 2009-07-24T13:15:27.620 回答
2
>>> weird = u'Rafa\xc5\x82'
>>> weird.encode('latin1').decode('utf8')
u'Rafa\u0142'
>>>

latin1 只是 Richie'snut'n'bolts 方法的缩写。

非常奇怪的是,严重低估的raw_unicode_escape编解码器给出了与这种情况相同的结果latin1。他们总是给出相同的结果吗?如果是这样,为什么要有这样的编解码器?如果不是,最好确切地知道 OP 的客户端是如何进行从'Rafa\xc5\x82'到的转换u'Rafa\xc5\x82'然后准确地反转该过程 - 否则如果在修复双重编码之前出现不同的数据,我们可能会陷入困境。

于 2009-07-24T14:31:52.603 回答