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