Decodificación utf8 doble codificado en Python
Pregunta
Tengo un problema con las cadenas que recibo de uno de mis clientes más xmlrpc. Él me envía cadenas UTF8 que se codifican dos veces :( así que cuando los consigo en Python Tengo un objeto Unicode que tiene que ser decodificada una vez más, pero, obviamente, Python no permitirlo. Me he dado cuenta de mi cliente sin embargo necesito hacer solución rápida por ahora antes de que lo fija.
string crudo de la descarga tcp:
<string>Rafa\xc3\x85\xc2\x82</string>
este se convierte en:
u'Rafa\xc5\x82'
Lo mejor que se obtiene es:
eval(repr(u'Rafa\xc5\x82')[1:]).decode("utf8")
Esto se traduce en cadena correcta que es:
u'Rafa\u0142'
Sin embargo esto funciona es feo como el infierno y no se puede utilizar en el código de producción. Si alguien sabe cómo solucionar este problema de una manera más adecuada puede escribir. Gracias, Chris
Solución
>>> s = u'Rafa\xc5\x82' >>> s.encode('raw_unicode_escape').decode('utf-8') u'Rafa\u0142' >>>
Otros consejos
Yow, que fue muy divertido!
>>> 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'
Así que lo hace la primera decodificación, para conseguir una cadena Unicode, donde cada personaje es en realidad un valor de byte UTF-8. Vas a través del valor entero de cada uno de esos personajes que volver a una verdadera cadena UTF-8, que luego decodificar de forma normal.
>>> weird = u'Rafa\xc5\x82'
>>> weird.encode('latin1').decode('utf8')
u'Rafa\u0142'
>>>
latin1 es sólo una abreviatura para el método nuts'n'bolts de Richie.
Es muy curioso que el codec raw_unicode_escape
muy insuficientemente descrito da el mismo resultado que latin1
en este caso. ¿Es que siempre dan el mismo resultado? Si es así, ¿por qué tener un codec? Si no es así, sería preferible a saber con certeza exactamente cómo el cliente de la OP hizo la transformación de 'Rafa\xc5\x82'
a u'Rafa\xc5\x82'
y luego revertir ese proceso exactamente - de lo contrario podría fracasar si los datos de diferentes cultivos antes se fija la doble codificación