それがなぜ起こるかについてのもう少しの情報。
>>> s = u'\u2265'
>>> print s
print
は、UTF-8に設定されている可能性が高い環境のシステムエンコーディングを自動的に使用するため機能します。(で確認できますimport sys; print sys.stdout.encoding
)
>>> print "{0}".format(s)
format
呼び出されたタイプのエンコーディングと一致させようとするため失敗します(これに関するドキュメントは見つかりませんでしたが、これは私が気付いた動作です)。文字列リテラルはPython 2でASCIIとしてエンコードされたバイト文字列なので、ASCII としてformat
エンコードしようとするs
と、その例外が発生します。観察する:
>>> 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
は、ソースファイルの先頭に配置します。