Thêm một chút thông tin về lý do tại sao điều đó xảy ra.
>>> s = u'\u2265'
>>> print s
hoạt động vì print
tự động sử dụng mã hóa hệ thống cho môi trường của bạn, có khả năng được đặt thành UTF-8. (Bạn có thể kiểm tra bằng cách làm import sys; print sys.stdout.encoding
)
>>> print "{0}".format(s)
thất bại vì format
cố gắng khớp mã hóa của loại được gọi (tôi không thể tìm thấy tài liệu về điều này, nhưng đây là hành vi tôi đã nhận thấy). Vì chuỗi ký tự là các chuỗi byte được mã hóa dưới dạng ASCII trong python 2, nên format
cố gắng mã hóa s
thành ASCII, sau đó dẫn đến ngoại lệ đó. Quan sát:
>>> 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)
Vì vậy, đó là cơ bản tại sao các phương pháp này hoạt động:
>>> s = u'\u2265'
>>> print u'{}'.format(s)
≥
>>> print '{}'.format(s.encode('utf-8'))
≥
Bộ ký tự nguồn được xác định bởi khai báo mã hóa; đó là ASCII nếu không có khai báo mã hóa nào được đưa ra trong tệp nguồn ( https://docs.python.org/2/reference/lexical_analysis.html#opes-literals )
from __future__ import unicode_literals
ở đầu các tệp nguồn của bạn.