Pythonでstdoutをパイプするときに正しいエンコーディングを設定する 質問する

Pythonでstdoutをパイプするときに正しいエンコーディングを設定する 質問する

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 であることを前提としている可能性があるため、お勧めできません。設定しないでください。

おすすめ記事