Parseando XML sin Unicode

Francesc Alted falted en openlc.org
Jue Jul 4 12:16:35 CEST 2002


Lo que pasa es que Python usa por defecto una codificación "ascii" de 7
bits para el I/O por defecto:

>>> p = 'España'
>>> p = unicode(p,'latin-1')
>>> p
u'Espa\xf1a'
>>> print p

Traceback (most recent call last):
  File "<stdin>", line 1, in ?
UnicodeError: ASCII encoding error: ordinal not in range(128)

Hasta aqui el error normal. Observad que Python sabe que p es un string
Unicode (la 'u' delante de la cadena). Sin embargo al intentar hacer una
operación de I/O (print) da el error correspondiente. Me imagino que Attila
no habrá intentado hacer un "print", sino simplement una operación
equivalente a repr().

Por tanto, hace falta cambiar la codificación para isolatin1 (o en general
para cualquier otra como UTF-8). Aquí podeis ver un ejemplo de como cambia
la codificación para el I/O:

>>> import codecs
>>> (encoder, decoder, reader, writer) = codecs.lookup('latin-1')
>>> import sys  
>>> f = writer(sys.stdout)
>>> f.write(p)
España>>> 

En mi opinión, Python es demasiado estricto a la hora de exigir 7 bits por
defecto en el I/O. Si dejara salir 8 (independientemente de la codificación
escogida) tampoco hubiera pasado nada. El problema aparece cuando el
'latin-1' se considera unicode dentro de Python i por tanto cada caracter
ocupa 16 bits en lugar de 8, por lo que se ha de recurrir al módulo codecs
para hacer la conversión al vuelo. En fin, esperemos que, como dice Hernán,
hagan todo esto un poco más "inteligente" e intuitivo, por que ahora mismo
es un poco "chapuza".

Saludos,

Francesc

On Thu, Jul 04, 2002 at 09:45:14AM +0200, Garikoitz Araolaza wrote:
> Decía kmilo:
> >Python 2.2 (#1, Mar 26 2002, 15:46:04)
> >[GCC 2.95.3 20010315 (SuSE)] on linux2
> >Type "help", "copyright", "credits" or "license" for more information.
> >>>> p = 'España'
> >>>> p = unicode(p,'latin-1')
> >>>> print p
> >
> >Traceback (most recent call last):
> >  File "<stdin>", line 1, in ?
> >UnicodeError: ASCII encoding error: ordinal not in range(128)
> >>>>
> >
> >¿ por que ?
> 
> Pues sí! es el siguiente problema con que me he encontrado...
> 
> Alguien tiene alguna pista?
> 
> Saludos
> 
> Gari
> 
> 
> _________________________________________
> Garikoitz Araolaza
> gari en eibar.org
> 
> _______________________________________________
> Python-es mailing list
> Python-es en aditel.org
> http://listas.aditel.org/listinfo.py/python-es
> 
> 
> 

-- 
Francesc Alted                            PGP KeyID:      0x61C8C11F
OpenLC microkernel benchmarking project: http://www.openlc.org
Public PGP key available: http://www.openlc.org/falted_at_openlc.asc
Key fingerprint = 1518 38FE 3A3D 8BE8 24A0  3E5B 1328 32CC 61C8 C11F


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