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


156

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()関数を使用する必要があります。

回答:


243

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)
≥
>>> 

40
@Kit:すべてのリテラルを(Python 3のように)Unicodeにしたい場合from __future__ import unicode_literalsは、ソースファイルの先頭に配置します。
フィリップ

1
ええ、これは、この "%s"%u "\ u2265"が機能するので%のフォーマットに慣れている場合に使用できますが、 "{}"。format(u "\ u2265")は​​例外をスローします。
ハイリダン

2
なんて単純なことだろう。この悟りのビットが見つかるまでに私が得た恐ろしい頭痛の種は..
Iosu S.


5

それがなぜ起こるかについてのもう少しの情報。

>>> 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


1
ああ、私はこれがpythonのユニコードと一般的なコンピューターシステムのテキスト表現を理解する上で非常に役立つことがわかりました:nedbatchelder.com/text/unipain.html
lps
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.