すべてのロケールが UTF-8 である最近の Linux システムを実行しています。
LANG=de_DE.UTF-8
LANGUAGE=
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
...
LC_IDENTIFICATION="de_DE.UTF-8"
LC_ALL=
ここで、UTF-8 でエンコードされたコンテンツをコンソールに書き込みたいと思います。
現在、Python は FS エンコーディングに UTF-8 を使用していますが、デフォルトのエンコーディングには ASCII を使用しています :-(
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.getfilesystemencoding()
'UTF-8'
PYTHONIOENCODING
これを行うための最良の(クリーンな)方法は、環境変数を設定することだと思いました。しかし、Pythonはそれを無視しているようです。少なくとも私のシステムでは、 envvarascii
を設定した後でも、デフォルトのエンコーディングとして取得し続けます。
# tried this in ~/.bashrc and ~/.profile (also sourced them)
# and on the commandline before running python
export PYTHONIOENCODING=UTF-8
スクリプトの開始時に次のようにすると、機能します。
>>> import sys
>>> reload(sys) # to enable `setdefaultencoding` again
<module 'sys' (built-in)>
>>> sys.setdefaultencoding("UTF-8")
>>> sys.getdefaultencoding()
'UTF-8'
しかし、そのアプローチは不潔に思えます。それで、これを達成するための良い方法は何ですか?
回避策
デフォルトのエンコーディングを変更する代わりに-これは良い考えではありません(メシリアックの回答を参照)-私は次sys.stdout
のようにラップしStreamWriter
ます:
sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout)
それを処理する小さなユーティリティ関数については、この要点を参照してください。