Un poco más de información sobre por qué sucede eso.
>>> s = u'\u2265'
>>> print s
funciona porque print
usa automáticamente la codificación del sistema para su entorno, que probablemente se configuró en UTF-8. (Puede verificar haciendo import sys; print sys.stdout.encoding
)
>>> print "{0}".format(s)
falla porque format
intenta hacer coincidir la codificación del tipo al que se llama (no pude encontrar documentación sobre esto, pero este es el comportamiento que he notado). Dado que los literales de cadena son cadenas de bytes codificadas como ASCII en python 2, format
intenta codificar s
como ASCII, lo que resulta en esa excepción. Observar:
>>> s = u'\u2265'
>>> s.encode('ascii')
Traceback (most recent call last):
File "<input>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2265' in position 0: ordinal not in range(128)
Entonces, esa es básicamente la razón por la que funcionan estos enfoques:
>>> s = u'\u2265'
>>> print u'{}'.format(s)
≥
>>> print '{}'.format(s.encode('utf-8'))
≥
El conjunto de caracteres de origen se define mediante la declaración de codificación; es ASCII si no se proporciona una declaración de codificación en el archivo fuente ( https://docs.python.org/2/reference/lexical_analysis.html#string-literals )
from __future__ import unicode_literals
al comienzo de sus archivos fuente.