インタラクティブモードのエンコード

インタラクティブモードで正しいエンコードを指定する方法

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'ほげ'
ほげ

といったことができるようになります。