2009-07-24 56 views
19

我遇到了一個字符串問題,我通過xmlrpc從我的一個客戶端獲得了字符串。他向我發送了編碼兩次的utf8字符串:(所以當我在python中獲得它們時,我有一個unicode對象需要再次解碼,但顯然python不允許這樣做。到現在他修正它之前做快速的解決方法在Python中解碼雙重編碼的utf8

從TCP轉儲原始字符串:

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

這個被轉換成:

u'Rafa\xc5\x82' 

我們得到的最好的是:

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

這導致正確的字符串是:

u'Rafa\u0142' 

這工作然而這醜陋的地獄,並且不能在生產代碼中使用。 如果有人知道如何以更合適的方式解決這個問題,請寫。 謝謝, 克里斯

回答

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

@partisann:整潔!我不知道raw_unicode_escape(顯然8-) – RichieHindle 2009-07-24 13:17:42

+0

謝謝partisann,我也不知道它。 – 2009-07-27 09:10:47

3

佑,這很有趣!

>>> 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字符串,然後你就可以正常解碼。

2
>>> 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'轉換的,然後準確地反轉這個過程 - 否則如果在雙重編碼修復之前不同的數據出現,那麼我們可能會解散。