[Python-es] utf-8

Arnau Sanchez pyarnau en gmail.com
Vie Jul 30 10:32:49 CEST 2010


On Thu, 29 Jul 2010 11:50:40 -0700 (PDT) Jean Carlos Rodrìguez wrote:

> >>> a = 'eñe'
> >>> print a
> eñe
> >>> b = []
> >>> b.append(a)
> >>> b
> ['e\xc3\xb1e']
> >>> b[0]
> 'e\xc3\xb1e'
> >>> utf8 = lambda s: unicode(s, 'iso-8859-1').encode('utf-8')
> >>> utf8(b[0])
> 'e\xc3\x83\xc2\xb1e'
> 
> Como hago para que tenga los acentos y eñes??

Este tema, de una u otra forma, ha aparecido muchas veces en la
lista (Chema se ha hartado a contestar preguntas de utf8 :-)).

La clave es ver la diferencia entre una cadena y su representación
(repr):

>>> s = "camión"
>>> print s
camión
>>> s
'cami\xc3\xb3n'  

Cuando la consola muestra algo por pantalla (tercera línea), estás
viendo el repr() del objeto:

>>> print repr(s)
'cami\xc3\xb3n'

En el repr() de un objeto sólo aparece ASCII, todo lo demás está
escapado. Habría que mirar el código, pero aparentemente se hace algo
tipo string_escape + añadir comillas simples:

>>> print s.encode("string_escape")
cami\xc3\xb3n

En resumen, en repr() no verás nunca acentos, eñes, etc, se trata de
crear un objeto que pueda evaluarse sin problemas (fíjate que
eval(repr(s)) = s). No sé si en Python3K está previsto que esto cambie.


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