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としてエンコードしますか?このエラーを無効にするにはどうすればよいですか?
端末またはコンソールが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とコンソールまたは端末に大きく依存します。