しばらくの間、使用できないと仮定しますprint
(したがって、自動エンコーディング検出の利点を享受できます)。だからそれは私たちにを残しsys.stdout
ます。ただし、賢明なエンコーディングを行わないsys.stdout
ほど馬鹿げています。
ここで、Python wikiページのPrintFailsを読み、次のコードを試してみます。
$ python -c 'import sys, codecs, locale; print str(sys.stdout.encoding); \
sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout);
ただし、これも機能しません(少なくともMacでは)。理由がわかりすぎます:
>>> import locale
>>> locale.getpreferredencoding()
'mac-roman'
>>> sys.stdout.encoding
'UTF-8'
(UTF-8は端末が理解できるものです)。
したがって、上記のコードを次のように変更します。
$ python -c 'import sys, codecs, locale; print str(sys.stdout.encoding); \
sys.stdout = codecs.getwriter(sys.stdout.encoding)(sys.stdout);
これで、Unicode文字列が適切に送信さsys.stdout
れ、端末に適切に印刷されます(端末sys.stdout
に接続されています)。
これはUnicode文字列を書き込む正しい方法ですか、sys.stdout
それとも他のことをする必要がありますか?
編集:時々-たとえば、出力をless
-にパイプするとき-sys.stdout.encoding
になりますNone
。この場合、上記のコードは失敗します。