| トップページ | Python 標準ドキュメント | 事例集 | アーティクル | リンク集 | ダウンロード | サイトマップ | |
![]() |
![]() |
|
日本語環境でのPython (for Python 2.1, 2.2)皆さんがPythonを使いはじめるとき、なんと言っても気になるのは「ちゃんと日本語使えるのかなぁ」ということではないかと思います。結論から言えば、現在のPythonは日本語環境で利用可能です。しかし、特別な日本語対応処理は施されていないため、ちょっとした小技が必要になる場合があります。 Pythonの文字列型まず、Pythonの文字列型データは8ビット透過ですので、文字列の中に文字コードが 0 から 255 までのどんな値が含まれていても処理することが出来ます。Pythonの文字列型データに日本語が含まれていても、ビット落ちなどの障害が発生することはありません。いったんデータとして日本語文字列を取り込んでしまえば、あとはPerlやCの文字列と同等な日本語処理が可能となります。 ただし、Windowsなど日本語のエンコーディングとしてShift JISを使用する環境では、文字列定数を書く場合に注意が必要です。Shift JISでは値にバックスラッシュ(=0x5c)が含まれる場合がありますが、Pythonではバックスラッシュはエスケープ文字として扱われますので、そのような文字が文字列定数に含まれていると意図しない結果となってしまいます。また、文字列の最後がバックスラッシュとなるような場合には、コンパイルエラーが発生します。 この問題を回避するには、次の方法があります。
Unicode型Python1.6以降ではUnicode文字列がサポートされていますので、日本語処理はUnicodeで行うのも一案です。 CodecCodecとは、PythonでサポートされているUnicode文字列(UCS-2)と、それ以外の文字列とを相互に変換する為のPythonモジュールです。たとえば日本語環境でのEUC-JP<->UnicodeやShift JIS<->Unicodeの変換、あるいはUTF-8<->UCS-2の変換などを行います。 現在、日本語処理に使用することのできるCodecは2種類存在します。
使い方Unicodeの文字列定数は、次のように記述します。 ustr = u"This is Unicode string" ただし、この形式ではCodecを指定することができないため、 ustr = u"日本語のユニコード文字列" と書いても正しく変換することはできません。 そこで、日本語を使う場合には、unicode()関数を使って次のよう明示的にCodecを指定するようにします。 jstr = unicode("日本語のユニコード文字列", "japanese.euc_jp")
また、Unicode文字列を通常の文字列に戻すには、encode() メソッドを使用します。
jstr = unicode("日本語のユニコード文字列", "japanese.euc_jp")
print jstr.encode("japanese.sjis")
この場合もCodecをパラメータとして指定し、適切な形式の文字列に変換することができます。 unicode() や encode()で引数を省略した場合、デフォルトではascii用Codecを使用して変換されます。省略時に別のCodecを使用するには Pythonライブラリディレクトリにある site.py の encoding = "ascii" # Default value set by _PyUnicode_Init()を encoding = "japanese.euc_jp" # Default value set by _PyUnicode_Init() のように書き換える必要があります。このように指定しておけば、
jstr = unicode("日本語")
print jstr.encode()
ではEUC-JP文字列として正しく変換されるようになります。ただし、 jstr = u"日本語" と書いた場合には効果はなく、ascii文字列として解釈されてしまいますので注意してください。 正規表現Pythonでは正規表現は re モジュールとしてサポートされていますが、re はマルチバイト文字列に対応しておらず、日本語混じりのテキストを扱う場合にはPerlなどと同じような注意が必要となります。実験的にマルチバイト文字列をサポートした re モジュールも公開されていますが、推奨できるレベルにはなっていません。 しかし、re モジュールはUnicode文字列をサポートしてますので、日本語を使用する場合はUnicode化して使用すると良いでしょう。
import re
re.findall(unicode("[あ-ん]+", "mbcs"),
unicode("あめんぼ赤いなあいうえお", "mbcs"))
のように、Unicode文字列であれば日本語でも問題なく処理することができます。 文字列出力Pythonの対話モードなどで文字列をコンソールに出力する場合、 >>> print 'あいうえお' あいうえおのように文字列をprint文で出力するのであれば正しく日本語が出力されますが、日本語を含むリストや辞書オブジェクトを出力する場合などは、 >>> jplist = ['あいうえお'] >>> print jplist ['\xa4\xa2\xa4\xa4\xa4\xa6\xa4\xa8\xa4\xaa']のように文字コードとして出力されてしまいます。デバッグ時などには大変不便なのですが、手軽な回避手段は無いようです。Windows環境では、前述のSJIS対応版を使用すれば通常の日本語文字列として出力することができます。 ファイル名操作Pythonではファイル名を操作する場合は os.pathモジュールを使うのが正式な作法となっています。たとえばカレントディレクトリのファイル foo の絶対パスを取得する場合は import os curdir = os.getcwd() # カレントディレクトリ名を取得 print os.path.join(curdir, "foo") とします。面倒なようですが、これによってOS固有のパス区切り文字などを気にせず、移植性の高いプログラムを作成することができます。 しかし、(例によって)Windows環境では問題が発生します。Windowsではパス区切り文字が"\"で、全角文字の2バイト目が "\" に当たる場合があるためです。 これも簡単な対処方法がありませんが、Windows環境ではos.pathモジュールはUnicode文字列をサポートしていますので import os curdir = os.getcwd() # カレントディレクトリ名を取得 print os.path.join(unicode(curdir, "mbcs"), "foo")とすることで対応することが可能です。 |
|
|
|
|
|
また、日本Pythonユーザ会はサイト内のコンテンツに他のプログラミング言語からの乗り換えを誘発する恐れのある表現が多々あることを認め、予めお詫び申し上げます。 |