Um pouco mais de informação sobre por que isso acontece.
>>> s = u'\u2265'
>>> print s
funciona porque print
usa automaticamente a codificação do sistema para o seu ambiente, que provavelmente foi definida como UTF-8. (Você pode verificar fazendo import sys; print sys.stdout.encoding
)
>>> print "{0}".format(s)
falha porque format
tenta corresponder à codificação do tipo em que é chamado (não consegui encontrar documentação sobre isso, mas esse é o comportamento que notei). Como literais de strings são strings de bytes codificados como ASCII no python 2, format
tenta codificar s
como ASCII, o que resulta nessa exceção. 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)
Então é basicamente por isso que essas abordagens funcionam:
>>> s = u'\u2265'
>>> print u'{}'.format(s)
≥
>>> print '{}'.format(s.encode('utf-8'))
≥
O conjunto de caracteres de origem é definido pela declaração de codificação; é ASCII se nenhuma declaração de codificação for fornecida no arquivo de origem ( https://docs.python.org/2/reference/lexical_analysis.html#string-literals )
from __future__ import unicode_literals
no início dos arquivos de origem.