[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