Decodificare doppia utf8 codificato in Python
Domanda
Ho un problema con le stringhe che ricevo da uno dei miei clienti oltre XMLRPC. mi manda stringhe UTF8 che sono codificati due volte :( così quando li ricevo in python ho un oggetto unicode che deve essere decodificato una volta, ma ovviamente python non permetterlo. Ho notato il mio cliente però ho bisogno fare soluzione rapida per il momento prima che lo fissa.
stringa crudo di discarica tcp:
<string>Rafa\xc3\x85\xc2\x82</string>
questo viene convertito in:
u'Rafa\xc5\x82'
Il meglio che otteniamo è:
eval(repr(u'Rafa\xc5\x82')[1:]).decode("utf8")
Il risultato è corretto stringa che è:
u'Rafa\u0142'
questo funziona però è brutto come l'inferno e non può essere utilizzato nel codice di produzione. Se qualcuno sa come risolvere questo problema in modo più adatto si prega di scrivere. Grazie, Chris
Soluzione
>>> s = u'Rafa\xc5\x82' >>> s.encode('raw_unicode_escape').decode('utf-8') u'Rafa\u0142' >>>
Altri suggerimenti
Yow, che è stato divertente!
>>> 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'
Così si fa la prima decodifica, ottenendo una stringa Unicode in cui ogni personaggio è in realtà un valore di byte UTF-8. Si va via il valore intero di ciascuno di questi personaggi per tornare a una vera e propria stringa UTF-8, che poi decodificare come normale.
>>> weird = u'Rafa\xc5\x82'
>>> weird.encode('latin1').decode('utf8')
u'Rafa\u0142'
>>>
latin1 è solo l'abbreviazione per il metodo nuts'n'bolts di Richie.
E 'molto curioso che il codec raw_unicode_escape
seriamente sotto-descritto dà lo stesso risultato di latin1
in questo caso. Non danno sempre lo stesso risultato? Se sì, perché avere un tale codec? In caso contrario, sarebbe preferibile sapere con certezza esattamente come cliente del PO ha fatto la trasformazione da 'Rafa\xc5\x82'
a u'Rafa\xc5\x82'
e poi invertire quel processo esattamente - altrimenti potrebbe venire scollarsi se i dati diverse colture prima la codifica doppia è fisso