Немного больше информации о том , почему это происходит.
>>> s = u'\u2265'
>>> print s
работает, потому что print
автоматически использует системную кодировку для вашей среды, которая, вероятно, была установлена в UTF-8. (Вы можете проверить, делая import sys; print sys.stdout.encoding
)
>>> print "{0}".format(s)
терпит неудачу, потому что format
пытается соответствовать кодировке типа, к которому он вызывается (я не смог найти документацию по этому вопросу, но это поведение я заметил). Поскольку строковые литералы являются байтовыми строками, закодированными как ASCII в Python 2, он format
пытается кодировать s
как ASCII, что затем приводит к этому исключению. Заметим:
>>> 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)
Вот почему в основном эти подходы работают:
>>> s = u'\u2265'
>>> print u'{}'.format(s)
≥
>>> print '{}'.format(s.encode('utf-8'))
≥
Исходный набор символов определяется объявлением кодировки; это ASCII, если в исходном файле не указано объявление кодировки ( https://docs.python.org/2/reference/lexical_analysis.html#string-literals )
from __future__ import unicode_literals
в начало ваших исходных файлов.