[eside-ghost] python unicode harakiri

enrike altern2 en gmail.com
Mie Mar 2 12:04:47 CET 2011


>> la pregunta del millon... tengo un problemilla con unicode y python,
>> creo que no soy en unico. El caso es que tengo que hacer
>>
>> urllib.urlencode( {'blah': 'ñapás', 'blah': '機体'} )
>>
>> y por supuesto me casca por error unicode. los valores del diccionario
>> vienen de otro lado y llegan como llegan. Pueden tener de todo dentro de
>> ellos. Necesito procesarlo para que no casque pero la ñ se me resiste.
>>
>> estoy venga mirar online pero todo lo que veo me va en la linea de
>>   >>>  unicode(u'ñapás')
>>
>> pero es que a mi no me llegan strings de tipo u'blahblah' sino
>> simplemente 'blahblah'
>>
>
> Usease, que te llega un str de algún lado en algún encoding y tienes
> que encodearlo a UTF-8 (pasando por unicode, claro) antes de mandarlo
> por la red, cierto?
>
> De tu ejemplo de abajo deduzco que el str te viene encodeado en ISO-8859-1.

bueno... no estoy seguro de lo que llega, eso era solo una prueba. ya te 
digo que puede tener caracteres de japones o chino, otras ingles normal 
pero tb ñ, tildes óaéíú etc... tengo que poder coger cualquier cosa y 
hacerla pasar por el aro

> Tenemos un str encodeado en iso8859-1 que dice 'ñapa':
>
> s_8859 = '\xf1apa'
>
> Lo pasamos a unicode:
>
> u = s_8859.decode('iso8859-1')
>
> Ahora ya lo podemos encodear como queramos:
>
> s = u.encode('utf-8')
>
> Si miramos la representación de s:
>
> print repr(s)
>
> '\xc3\xb1apa'
>
> Es distinta de s_8859, porque están codificadas con distinto encoding.
>
> Espero que te sirva, he estado sumergido en el infierno de unicode
> como un mes hace poco :-)

gracias por la explicacion.

el problema es que parece que a veces si me llega unicode en plan 
u'ñapás' y con esa solucion casca en el decode. Lo que no entiendo es 
com puedo convertir 'ñapas' en u'ñapas'. aunque igual estoy diciendo una 
chorrada.

ahora mismo estoy haciendo esto y parece que funciona pero no tengo muy 
claro de porque si o si dentro de un rato va a dar problemas.

     if isinstance(string, str) :
         string = unicode(string, 'utf-8')

     return string.encode('utf-8')

ah, se me ha olvidado decir que para hacelo todo mas facil el codigo 
corre en el Google App Engine que va sobre Python 2.5.2 creo. Asi que 
tampoco me puedo fiar al 100% de que lo que funcione en mi maquina vaya 
a funcionar alli arriba ...


Más información sobre la lista de distribución eside-ghost