web-dev-qa-db-ja.com

Python:Unicodeエスケープ文字列での.format()の使用

Python 2.6.5を使用しています。私のコードでは、「以上」記号を使用する必要があります。ここに行く:

>>> s = u'\u2265'
>>> print s
>>> ≥
>>> print "{0}".format(s)
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)`  

なぜこのエラーが発生するのですか?これを行う正しい方法はありますか? .format()関数を使用する必要があります。

153
Kit

2番目の文字列もUnicode文字列にするだけです

>>> s = u'\u2265'
>>> print s
≥
>>> print "{0}".format(s)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2265' in position 0: ordinal not in range(128)
>>> print u"{0}".format(s)
≥
>>> 
236
Mad Scientist

unicodesにはunicodeフォーマット文字列が必要です。

>>> print u'{0}'.format(s)
≥

whyについてもう少し情報があります。

>>> s = u'\u2265'
>>> print s

printは、UTF-8に設定されている可能性が高いシステムエンコーディングを環境で自動的に使用するため機能します。 (import sys; print sys.stdout.encodingを実行して確認できます)

>>> print "{0}".format(s)

formatが呼び出される型のエンコーディングと一致しようとするため失敗します(これに関するドキュメントは見つかりませんでしたが、これは私が気づいた動作です)。文字列リテラルはASCII 2でpythonとしてエンコードされたバイト文字列であるため、formatsを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

2
lps