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

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top