紫藤のWiki

最近の更新履歴

Pythonと日本語環境

Pythonは元々日本語を扱えませんでした。

日本では(ライバル同士と思われている)PythonとRubyのシェアのどっちが大きいか、と言ったら依然Rubyの方に軍配が上がります。
何故ならRubyは難なく日本語が扱えるから、です。
一方、Pythonは2.3辺りまで素ではUNICODEに対応していなかったのです。
そして、これがRubyのシェアに水をあけられた最大の原因でしょう。
現在公式ではPythonはUTF-8対応、と謳ってはいますが、確かに「UTF-8を扱える」事は扱えるんですが、色々被せて行ってるらしく、深層部ではいまだにASCIIでのエンコーディングが幅を効かせています。
これを何とかしよう、ってのがここでのトピックです。

これはWindowsでIDLE使っている人にはあまり関係ないトピックなんですが、Linux版のPythonの特徴として、
IDLE自体が日本語を受け付けないケースがある。
と言う事があり得るのです。つまり、Pythonデフォルトの開発環境自体が日本語入力を受け付けないのです。
ちなみに、WindowsでもIDLEでのUTF-8の出力は文字化けしまくり、です。あまり美しく無いんですよね。

多分、Pythonユーザー的にも「IDLEから離れたい」って思うことは無きにしもあらず、です。
ところがIDLEから離れちゃうととたんにこの「エンコーディング」の問題が浮上してきます(IDLEでは、設定でエンコーディングを指定できるので)。
特に、エンコーディングで一番問題が生じるのが「入出力関連」なのです。

例えば、端末でPythonを起動させて次のように入力してみます。
i = input(u"スパム、スパムって言ってるけど、そんなん喰った事ねえよ。あんたは?")
ここでPythonの文法には立ち入りませんが、一般に、文字列をu""で挟む事で、Pythonでは「UTF-8を使え」と言うお約束になっています。
ところが、これを入力すると返ってくるのが
Traceback (most recent call last): File "", line 1, in UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-31: ordinal not in range(128)
と何とも無情なメッセージ、です。 「asciiコーデックが文字を認識出来ない」とか返してくる。UTF-8だ、っつってんだろ、とか思ってもダメなのです。
(ちなみに、この実験で難なく日本語が通ったら、あなたの環境では日本語が問題無い、って事なんで以下の記事は無視して結構です)

この手のエンコーディング関係の解決法は3種類くらい紹介されているんですが、ポータビリティの問題で「あまり奨めない」と言われる「デフォルトエンコーディングの設定」をここでは紹介したい、と思います。
と言うのも、Python開発支援環境を整えよう、としていくと、当然また色々素のPythonに被せていかなければならないんですが、書いたソースコードが難なくエンコードを通り抜けても今度は逆に「開発支援環境自体が」文字化け起こしたりしてダメダメなのです。
この辺、Pythonは「もの凄くおバカ」な言語だ、ってのが本当のところで、Common Lispなんかじゃ滅多にお目にかからない現象に出くわすこと間違いなし、なんです。
(その辺りではPythonは"ツギハギ言語"であるのは間違いないでしょう。一貫性が無いのです。)

さて、Pythonのデフォルトエンコーディングを握る鍵はsite.pyと名付けられたファイルなんですが、問題はこれがどこにあるのか、と言う事です。
例えばLinuxでのPython2.5の場合、site.pyは次のどっちかに存在すると思います。
  • /usr/local/lib/python2.5/
  • /usr/lib/python2.5/
一般的には上のパスに存在するらしいんですが、Debian系ディストリビューションだったら下のパスに存在する、と思われます。
次に、site.pyが見つかったディレクトリでsitecustomize.pyと言うファイルを作成します(注)。sitecustomize.pyの内訳は以下の通りです。
import sys
sys.setdefaultencoding('utf-8')
これで完成です。もう一回例示コードを試してみましょう。


これでエンコーディングの問題は全て解決、です。
「臭い物は元から断たなきゃダメ」と言うのがPythonのエンコーディング流儀、なのです。
注:Debian系ディストリビューションには既に「全く別の目的の為に」sitecustomize.pyが存在している可能性がある。 内訳は以下の通り。
    # install the apport exception handler if available
    try:
    import apport_python_hook
    except ImportError:
    pass
    else:
    apport_python_hook.install()
その場合、単純に一番下に上で説明したデフォルトエンコーディング設定コードを書き加えれば良い(もちろんインデントを揃える事)。
このsitecustomize.pyは例外処理で記述されてるが、エラー回避が確認できた時点で、else:が実行されるので、この時点でデフォルトエンコーディングがUTF-8にすんなり設定される。