インタラクティブモードのエンコード
インタラクティブモードで正しいエンコードを指定する方法
tags: | python, tips, experiment, interact-mode, encoding |
---|---|
created: | 2006-08-03T13:07:12 |
インタラクティブモードとエンコード インタラクティブモードで日本語を使いたい時~。
日本語問題について
以前書いた時 からからいろいろ整理すると、
Pythonとプラットフォームに関連したエンコーディングの ファクターは6つあります。
- コード記述環境のエンコーディング
- ファイルシステムのエンコーディング
- シェル環境の標準入力エンコーディング
- シェル環境の標準出力エンコーディング
- シェル環境のエラー出力エンコーディング
- デフォルトエンコーディング
このうち、後者5つは以下のコードで調べられます。
import sys
print sys.getfilesystemencoding()
print sys.stdin.encoding
print sys.stdout.encoding
print sys.stderr.encoding
print sys.getdefaultencoding()
あとひとつ「コード記述環境のエンコーディング」は、ソースコードの先頭ないし2行目に記述できる
# -*- encoding: ****** -*-
という記述ですね。
これらが一致しているのが一番問題がなくていいのですが、 Windowsでは、
>>> import sys
>>> print sys.getfilesystemencoding()
mbcs
>>> print sys.stdin.encoding
cp932
>>> print sys.stdout.encoding
cp932
>>> print sys.stderr.encoding
None
とでますね。
日本語Windowsを使っている限り、mbcsとcp932は内部的に「shift-jis」と同じ処理になります。 じゃ、結局デフォルトエンコーディング、コード記述共に「cp932」つまり「shift-jis」を指定すると問題がなくなるということでしょう。
実際、PyFileServerというWevDavサーバもデフォルトエンコーディング指定により動作するようです。
Pythonではdocstringを英語で書くことを推奨していますが、ここまでshift-jisに徹底すれば、docstringに日本語を使うこともできるようになります。
あまりエンコーディングで悩みたくない人は、あらゆる設定をshift-jisにするといいのかも。
インタラクティブモードだけshift-jis
しかし、私はWeb関連との絡みでutf-8をデフォルトにしています。 エディタもutf-8をデフォルトにしています。
しかし、Windowsにはシェルの選択肢がほぼmbcsのみ。
インタラクティブモードで日本語を使うのは面倒だったのですが、 インタラクティブモードにだけコード記述エンコード指定をする方法がありました。
環境変数「PYTHONSTARTUP」を用います。
interact.py
# -*- encoding: mbcs -*-
こんなファイルを作って、環境変数にこのファイルのフルパスを指定しておくのです。
すると、Pythonデフォルトエンコーディングに関わらず、インタラクティブモードのエンコードだけ mbcsにすることができます。
>>> print u'ほげ'
ほげ
といったことができるようになります。