que empezar por crear una variable de cadena con algunos no-asciiUTF-8 datos codificados en él:¿Por qué unicode() usa str() en mi objeto solo sin codificación?
>>> text = 'á'
>>> text
'\xc3\xa1'
>>> text.decode('utf-8')
u'\xe1'
Usando unicode()
en él plantea errores ...
>>> unicode(text)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0:
ordinal not in range(128)
. ... pero si conozco la codificación, puedo usarla como segundo parámetro:
>>> unicode(text, 'utf-8')
u'\xe1'
>>> unicode(text, 'utf-8') == text.decode('utf-8')
True
Ahora bien, si tengo una clase que devuelve este texto en el método __str__()
:
>>> class ReturnsEncoded(object):
... def __str__(self):
... return text
...
>>> r = ReturnsEncoded()
>>> str(r)
'\xc3\xa1'
unicode(r)
parece utilizar str()
en él, ya que plantea el mismo error que unicode(text)
arriba:
>>> unicode(r)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0:
ordinal not in range(128)
Hasta ahora ¡todo está según lo planeado!
Pero como nadie nunca esperar, unicode(r, 'utf-8')
ni siquiera se trate:
>>> unicode(r, 'utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: coercing to Unicode: need string or buffer, ReturnsEncoded found
¿Por qué? ¿Por qué este comportamiento inconsistente? ¿Es un error? es intencionado? Muy incomodo.
Creo que no me he dejado claro. Yo sé eso. Lo que quiero decir es saber POR QUÉ Unicode (r) tiene un comportamiento diferente que Unicode (r, 'utf-8') ??? – nosklo
El comportamiento es extraño porque trata de descodificar como ascii si no paso 'utf-8'. Pero si paso 'utf-8' da un error diferente ... – nosklo