Python プログラムの出力をパイプすると、Python インタープリターはエンコーディングについて混乱し、それを None に設定します。これは、次のようなプログラムを意味します。
# -*- coding: utf-8 -*-
print u"åäö"
通常どおり実行すると正常に動作しますが、次のエラーで失敗します:
UnicodeEncodeError: 'ascii' コーデックは位置 0 の文字 u'\xa0' をエンコードできません: 序数が範囲外です (128)
パイプシーケンスで使用する場合。
パイプ時にこれを機能させる最善の方法は何ですか? シェル/ファイルシステム/その他が使用しているエンコードを使用するように指示するだけでよいですか?
これまでに見た提案は、site.py を直接変更するか、次のハックを使用して defaultencoding をハードコーディングすることです。
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
print u"åäö"
配管を機能させるより良い方法はありますか?
ベストアンサー1
Python はターミナル アプリケーションが使用しているエンコードに出力をエンコードするため、スクリプトで実行するとコードは機能します。パイプを使用する場合は、自分でエンコードする必要があります。
経験則としては、内部では常に Unicode を使用します。受信したものはデコードし、送信するものはエンコードします。
# -*- coding: utf-8 -*-
print u"åäö".encode('utf-8')
もう 1 つの教育的な例は、ISO-8859-1 と UTF-8 を変換し、その間にあるすべてを大文字にする Python プログラムです。
import sys
for line in sys.stdin:
# Decode what you receive:
line = line.decode('iso8859-1')
# Work with Unicode internally:
line = line.upper()
# Encode what you send:
line = line.encode('utf-8')
sys.stdout.write(line)
システムのデフォルトのエンコーディングを設定するのは、使用するモジュールやライブラリが ASCII であることを前提としている可能性があるため、お勧めできません。設定しないでください。