encoding

Chema Cortes py en ch3m4.org
Mar Jul 4 13:21:55 CEST 2006


L Solis oficina escribió:
> me encuentro el siguiente problema con la ñ,
> 
> Traceback (most recent call last):
>  File "D:\dev\python\dao\Graficos_xy\Data_xy.py", line 424, in append_data
> lista.append(str(titulo2))
> UnicodeEncodeError: 'ascii' codec can't encode character u'\xd1' in
> position 11: ordinal not in range(128)
> 
> he probado con
> # -*- coding: iso-8859-15 -*- y con # -*- coding: utf-8 -*-
> si pongo
> # -*- coding: utf-16 -*-
> me da el error
> SyntaxError: UTF-16 stream does not start with BOM (main.py, line 3)
> 
> 
> ¿hay alguna manera de poder manejar la ñ?

Tendría que haber por lo menos una manera, si no habría que inventarla.

Ya lo he puesto alguna vez en un mensaje de la lista, pero no me importa
 repetir:

Algunas "codificaciones" de la letra Ñ:

latin1   --> d1
unicode  --> 00d1
utf8     --> c391
utf16le  --> fffe d100

Lo digo porque hay que utf8 es tan sólo una codificación de unicodes,
pero no es su equivalente.

Siguiendo con equivalencias, al trabajar en python con unicode tenemos
las siguiente equivalencias (según el PEP-100
http://www.python.org/dev/peps/pep-0100/)

str(u)      -->  u.encode()
print u     -->  print u.encode()
repr(u)     -->  "u%s" % repr(u.encode('unicode-escape'))


En tu caso, "titulo2" parece estar codificado en unicode con lo que
"str(titulo2)" es equivalente a "titulo2.encode()" que convierte la
cadena unicode en la codificación por defecto, normalmente ascii. No hay
letra 'Ñ' en ascii (ascii7, se entiende), por lo que da error. Tú sabrás
qué quieres hacer, pero ya que el título lo tienes codificado en unicode
lo mejor es seguir trabajando en unicode hasta que te veas obligado a
transformarlo en otra codificación. Para ello no emplees str(); emplea
titulo2.encode("latin1") o la codificación que necesites.

Especificando la codificación con un comentario "coding" estás indicando
"desde qué codificación" defines cadenas unicode del texto. Si las
cadenas las obtienes desde otros módulos o librerías, no te va a influir
en absoluto para nada.

La codificación del fichero de texto con el código depende del sistema
operativo que estés usando, pero ayuda bastante los editores de texto
para programadores que pueden trabajar en varias codificaciones. A
principio de los ficheros de texto se les suele poner una marca
"invisible" indicado que está codificado para unicode y el orden de los
bytes con el que se ha guardado el fichero. Ésa es la marca BOM (Byte
Order Mark) que le faltaba a tu fichero. No estaba guardado como utf16.



-- 
Chema Cortés (py en ch3m4.org)
"Proudly made on earth by generic humanoid carbon units"




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