Ein bisschen mehr Informationen darüber, warum das passiert.
>>> s = u'\u2265'
>>> print s
funktioniert, weil print
automatisch die Systemcodierung für Ihre Umgebung verwendet wird, die wahrscheinlich auf UTF-8 eingestellt war. (Sie können überprüfen, indem Sie tun import sys; print sys.stdout.encoding
)
>>> print "{0}".format(s)
schlägt fehl, weil format
versucht wird, die Codierung des aufgerufenen Typs abzugleichen (ich konnte keine Dokumentation dazu finden, aber dies ist das Verhalten, das ich bemerkt habe). Da String-Literale Byte-Strings sind, die in Python 2 als ASCII codiert sind, wird format
versucht, s
als ASCII zu codieren , was dann zu dieser Ausnahme führt. Beobachten:
>>> 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)
Deshalb funktionieren diese Ansätze im Grunde:
>>> s = u'\u2265'
>>> print u'{}'.format(s)
≥
>>> print '{}'.format(s.encode('utf-8'))
≥
Der Quellzeichensatz wird durch die Codierungsdeklaration definiert. Es ist ASCII, wenn in der Quelldatei keine Codierungsdeklaration angegeben ist ( https://docs.python.org/2/reference/lexical_analysis.html#string-literals ).
from __future__ import unicode_literals
an den Anfang Ihrer Quelldateien.