[pyar] problemas con el encoding

Roberto Alsina ralsina en netmanagers.com.ar
Vie Oct 22 09:57:43 ART 2010


On Friday 22 October 2010 08:39:33 Mario Cassanelli wrote:
> Estimado, mea culpa tambien,
>  no entendi lo que me estabas preguntando,
>  disculpe mi ignorancia -como decia el maestro-
>  el tema es cuando se hace el insert y lo que envio -???- sea un string,
>  que ahora estoy dudando segun lo que me decis,
>  asi que hay que probar / chequear otras cosas.
> 
> 
> 
> Entonces me respondo a mi mismo: inserto es un string de ython 2.x con
> probablemente encoding utf-8 pero no es seguro.
> 
> >>>exacto,  hay que verificar esto
> 
> Te recomiendo usar objetos unicode en tu programa siempre que puedas.
> 
> >>tengo que leer lo que me mando Facundo sobre unicode
> 
> Porqué? Porque si no, no hay manera de saber a ciencia cierta que es esa
> variable inserto. Fijate que la armás en base a algo que sacás del dbf.
> Si lo que está en el dbf no es UTF-8, inserto no es UTF-8.
> 
> >>esto hay que verificarlo y casi seguro que no es UTF-8,

La forma más fácil es hacer un 

print repr(algoquevinodeldbf)

Por ejemplo, la a con acento en utf8 se ve así:

>>> print repr(u'á'.encode('utf-8'))
'\xc3\xa1'

En cambio, la misma letra en latin-1 se ve así:

>>> print repr(u'á'.encode('latin-1'))
'\xe1'

> ahora, si estoy usando
> # -*- coding: utf-8 *-*
> en el inicio del programa
> me garantiza que lo que envio en un string es utf-8 o
> como decis arriba convertir todo a objetos unicode y
> enviar unicode por el driver a la base, eso es lo que
> tengo que probar...

Lo que hace el comentario ese es decirle a python que el archivo python (y por 
lo tanto los "string literals" que vos escribas en el) está encodeado en 
utf-8.

Ahora bien, si vos tenés un archivo python escrito en latin-1 y le ponés un 
comentario que dice que es utf-8,  sigue siendo latin-1 :-)

O sea, el comentario es algo que vos le das al intérprete para ayudarlo, no te 
garantiza nada, y menos con datos que no vienen del mismo archivo sino del 
DBF.

Si el DBF tiene adentro ASCII extendido o latin-1 o alguna otra cosa similar, 
entonces el string no va a ser utf-8. Mirá este ejemplo:

>>> print repr('%s'%(u'á'.encode('latin-1')))
'\xe1'

Ahí el u'á'.encode('latin-1') es un string encodeado latin-1 (que 
probablemente es lo que tenés en el DBF), y al hacer un %s adentro de un 
string encodeado utf-8 (porque mi intérprete usa utf-8 por default)... bueno, 
eso no es utf-8, es latin-1 :-)



More information about the pyar mailing list