Python のエンコーディング
% cat /usr/lib/python2.5/site-packages/sitecustomize.py import sys sys.setdefaultencoding('UTF-8') % cat enc.py import sys print >>sys.stderr, 'sys.stdout.encoding: %s' % sys.stdout.encoding print >>sys.stderr, 'sys.getdefaultencoding(): %s' % sys.getdefaultencoding() print unichr(0x3042) % python enc.py sys.stdout.encoding: UTF-8 sys.getdefaultencoding(): UTF-8 あ % python enc.py | cat sys.stdout.encoding: None sys.getdefaultencoding(): UTF-8 あ % sudo rm /usr/lib/python2.5/site-packages/sitecustomize.py % python enc.py sys.stdout.encoding: UTF-8 sys.getdefaultencoding(): ascii あ % python enc.py | cat sys.stdout.encoding: None sys.getdefaultencoding(): ascii Traceback (most recent call last): File "enc.py", line 4, in <module> print unichr(0x3042) UnicodeEncodeError: 'ascii' codec can't encode character u'\u3042' in position 0: ordinal not in range(128)
なんなんだろうなぁ。これは。Python を使い始めたときは戸惑った記憶が。とりあえず、標準出力のエンコーディングをホストにハードコードするのは避けたいよなぁ。あるひとは EUC-JP で、別の人は UTF-8 な端末で作業するなんてことはあるかもしれないし。なにより、スクリプトがホストの設定に依存するなんてのは気持ち悪い。
そんなこんなで、
import sys, locale, codecs
enc = locale.getpreferredencoding()
sys.stdout = codecs.getwriter(enc)(sys.stdout)
sys.stdin = codecs.getreader(enc)(sys.stdin)
なんてのが best practice なのかなぁ、と勝手に思っているわけなんだけどどうなんでしょ。