Трохи більше інформації про те , чому це відбувається.
>>> 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
на початку вихідні файли.