たとえば!
このコードを実行した時、
Traceback (most recent call last): File "<stdin>", line 1, in ? UnicodeError: MS932 encoding error: invalid character \x82
というような例外が発生するか、
ほげ
といったようにちゃんと表示される場合があったり、
または文字化けしてしまうというように
結果が3通りに分かれます。
分かれる要因は3つあります
コード記述環境のエンコーディング
Pythonに指定するエンコーディング
Pythonに指定済みのデフォルトエンコーディング
コード記述環境というのは主にエディタを指します。 インタラクティブモードを利用する場合、インタラクティブモードを動作させているシェルの事になります。 DOS窓ではmbcsというエンコーディングを用いています。
これらの環境が用いているエンコーディングに留意しておく必要があります。
Pythonに指定するエンコーディングとは、 ソースコード先頭ないし2行目に指定できる
こういった記述でPythonにソースコードがどんなエンコーディングであるかを指定する事ができます。 これはインタラクティブモードでは使えないようです。
Pythonに指定済みのデフォルトエンコーディングとは、とあるファイルを設置することで、Pythonにデフォルトエンコーディングを指定する事ができます。これは、上記の指定を省略した時にどのエンコーディングを利用するかをPythonに指定する物です。 当然インタラクティブモードの時のエンコーディングもこの指定で決定されます。
その指定方法とは「(Pythonインストールフォルダ)/Lib/site-packages」に「sitecustomize.py」という名前のファイルを作成するのです。
内容は以下の通り
sys.setdefaultencoding("utf-8")
こういう形でエンコーディングを指定する事ができます。
この指定をしない場合「'ascii'」エンコーディングになっています。
結局何が言いたいのかというと、前述の3要因の結果、Pythonに指定されたエンコーディングと、コード記述環境のエンコーディングが一致した時だけ、「u'ほげ'」といったコード記述が可能になるという事です。
この場合、多くは標準出力が期待するエンコーディングとインタラクティブモードのエンコーディングは一致しているのが普通なので、
でも問題なく表示されます。
それ以外の状況では、
というように毎回指定しなくてはなりません。
2番目のパラメータに1番目の文字列のエンコーディングを指定しなくてはならない。
「1番目の文字列のエンコーディング」は指定した文字列が文字列定数ならば、「コード記述環境のエンコーディング」ということになります。
存在しませんが、コード記述環境が「mbcs」で、標準出力が「utf-16」な環境では、以下のように記述します。
「'ほげ'」を「'mbcs'」としてデコードするとユニコード化され、それを「'utf-16'」でエンコードするとutf-16形式の文字列になるというわけです。
ユニコードのシェルがあれば、utf-16などにするとWindowsとの親和性はあがるかもしれませんね。
おもなエンコーディング指定を解説します。
| 'ascii': | 8bitキャラクタをそのまま取り扱います。 |
|---|---|
| 'mbcs': | Windowsの多バイト文字セット。これはWindowsロケールセッティングにより、日本語環境では「shift-jis」に対応付けられています。 |
| 'utf-8': | Web標準になりつつあるユニコードの8bit長サブセット。 7bitキャラクタのみを用いているコード(英語圏コード)と互換性があり、なおかつユニコード文字を利用できる。 mbcsでは、システム設定の唯一の言語にしか対応できないが、ユニコードでは、複数の言語を混在できる点が違う。 |
以上に挙げた以外にもいろんなエンコーディングがありますが、エンコーディングで悩まないためには、「utf-8」が最も有効である事は上記の特徴からも明らかでしょう。
ただし、ここで推奨する「utf-8」にしてしまうと、utf-8で記述したファイルをDOS窓で実行すると、
コード記述環境でのエンコーディングが「utf-8」で、標準出力が期待するエンコーディングが「mbcs」という状況が生まれます。
って毎回せなあかんの?と思われるかもしれません。
ユニコード文字列であれば、PythonかWindowsAPIかどちらか知りませんが、自動的にロケール設定である「shift-jis」に変換してくれます。
print u'ほげ'
というソースコードをDOS窓で実行してもちゃんと「ほげ」がでます。ご安心を。(出ない人はエディタの設定を間違っています。)
最終更新 2005-08-19 13:30:56