web-dev-qa-db-ja.com

unicode_literalsは何に使用されますか?

Pythonで__future__.unicode_literalsに奇妙な問題があります。 unicode_literalsをインポートせずに、正しい出力を取得します。

# encoding: utf-8
# from __future__ import unicode_literals
name = 'helló wörld from example'
print name

しかし、unicode_literalsインポートを追加すると:

# encoding: utf-8
from __future__ import unicode_literals
name = 'helló wörld from example'
print name

私はこのエラーを受け取りました:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xf3' in position 4: ordinal not in range(128)

unicode_literalsはすべての文字列をutf-8としてエンコードしますか?このエラーを無効にするにはどうすればよいですか?

36
ssj

端末またはコンソールがPythonにUTF-8をサポートしていることを通知できません。

from __future__ import unicode_literals行がなければ、UTF-8エンコードバイトを保持するバイト文字列を構築しています。文字列を使用して、unicode文字列を作成しています。

printは、これら2つの値を異なる方法で処理する必要があります。バイト文字列はsys.stdoutに変更なしで書き込まれます。 unicode文字列は最初にバイトにエンコードされ、Pythonはsys.stdout.encodingを参照します。システムがPythonがサポートするコーデックを正しく認識しない場合、デフォルトではASCIIが使用されます。

システムは、使用するコーデックをPythonに通知できませんでした。 sys.stdout.encodingはASCIIに設定され、unicode値をエンコードして印刷できませんでした。

これを確認するには、印刷時に手動でUTF-8にエンコードします。

# encoding: utf-8
from __future__ import unicode_literals
name = 'helló wörld from example'
print name.encode('utf8')

また、from __future__ importステートメントを使用せずにUnicodeリテラルを作成することにより、問題を再現できます。

# encoding: utf-8
name = u'helló wörld from example'
print name

ここで、u'..'もUnicodeリテラルです。

環境が何であるかについての詳細がなければ、ソリューションが何であるかを言うのは困難です。これは、使用するOSとコンソールまたは端末に大きく依存します。

46
Martijn Pieters