Problemas de encoding ejecutando en consola de linux, para variar.

Gabriel Genellina gagsl-py en yahoo.com.ar
Jue Feb 15 21:17:05 CET 2007


En Thu, 15 Feb 2007 16:16:40 -0300, bameda <bameda en gmail.com> escribió:

> para crear un objeto de la clase categoría el codigo es algo asi:
>
> """"""
> #!/usr/bin/env python
> # -*- coding: UTF-8 -*-
> (...)
> class Category:
>         def __init__(self,values):
>                 print "Valor: \'" + values[0] + "\'",
>                 print " - Tipo de value[0]: ",
>                 print type(values[0])

En general conviene usar repr() para debug, porque te da mas informacion;  
repr(values[0])
Aca no sabes realmente qué contiene, sólo cómo se "ve" en pantalla.

>
>                 if values[0] != None: self.__name =  
> values[0].encode('utf8')

encode es un metodo de los objetos unicode; recibe unicode y devuelve str  
en el encoding pedido.
(en realidad nunca debió existir str.encode, solo str.decode y  
unicode.encode, pero sino se hubiera complicado mucho la compatibilidad)
Todo va a andar bien si values[0] es unicode. O, si es una string pero  
ascii puro.

> Valor: 'Ofimática'  - Tipo de value[0]:  <type 'unicode'>
> Valor: 'Ofimática'  - Tipo de __name:  <type 'str'>

Vamos bien; recibe unicode, genera str

> Valor: 'Desarrollo'  - Tipo de value[0]:  <type 'str'>
> Valor: 'Desarrollo'  - Tipo de __name:  <type 'str'>

Aca tambien; recibe str (pero ascii); devuelve str.

> Write the "Category Description": none
> Valor: 'Categoría'  - Tipo de value[0]:  <type 'str'>

Oops... Que es esta 'Categoría' como str? Deberia ser unicode
Lo mejor seria fijarse de donde salio este valor, y arreglarlo para que  
sea unicode.
En general, "el mundo exterior" habla bytes y strings, y eso es lo que se  
guarda en los archivos. "Adentro" del programa, conviene manejar unicode  
siempre. La conversion string->unicode conviene hacerla apenas leido el  
dato, y la conversion unicode->str conviene hacerla justo antes de grabar.
La otra alternativa, bastante mas "chancha", es aceptar que te pueden  
aparecer indistintamente strings y unicode, y tratar de manejarlo:

     if values[0] is not None:
       if isinstance(values[0], unicode):
         self.__name =  values[0].encode('utf8')
       else:
         self.__name =  values[0] # y aca confiamos en que realmente sea  
utf8
         # o bien: self.__name = values[0].decode('utf8').encode('utf8')
         # que, si es cierto que es un string en utf-8, deberia dar lo  
mismo...

> PD. Mi Editor está en utf8, si en la consola de python solicito el
> encoding me da utf8 y en el XML también esta el encoding como utf8.

No estaras jugando con sys.setdefaultencoding, no? Seguro que  
sys.getdefaultencoding() te da utf-8?

-- 
Gabriel Genellina

------------ próxima parte ------------
_______________________________________________
Python-es mailing list
Python-es en aditel.org
http://listas.aditel.org/listinfo/python-es


Más información sobre la lista de distribución Python-es