トップページ | Python 標準ドキュメント | 事例集 | アーティクル | リンク集 | ダウンロード | サイトマップ 
468x60サイズバナー・シリーズC Simple Fun and Indented
コンテンツ
日本語環境でのPython (for Python 2.1, 2.2) - Pythonで日本語処理を行うために(for Python...
日本語環境でのPython (for Python 2.3 or later) - Pythonで日本語処理を行うために(for Python...
アーティクル
 
Python Powered
Powered by Zope
PyJUG網元衆










日本語環境でのPython (for Python 2.1, 2.2)

皆さんがPythonを使いはじめるとき、なんと言っても気になるのは「ちゃんと日本語使えるのかなぁ」ということではないかと思います。結論から言えば、現在のPythonは日本語環境で利用可能です。しかし、特別な日本語対応処理は施されていないため、ちょっとした小技が必要になる場合があります。

Pythonの文字列型

まず、Pythonの文字列型データは8ビット透過ですので、文字列の中に文字コードが 0 から 255 までのどんな値が含まれていても処理することが出来ます。Pythonの文字列型データに日本語が含まれていても、ビット落ちなどの障害が発生することはありません。いったんデータとして日本語文字列を取り込んでしまえば、あとはPerlやCの文字列と同等な日本語処理が可能となります。

ただし、Windowsなど日本語のエンコーディングとしてShift JISを使用する環境では、文字列定数を書く場合に注意が必要です。Shift JISでは値にバックスラッシュ(=0x5c)が含まれる場合がありますが、Pythonではバックスラッシュはエスケープ文字として扱われますので、そのような文字が文字列定数に含まれていると意図しない結果となってしまいます。また、文字列の最後がバックスラッシュとなるような場合には、コンパイルエラーが発生します。 この問題を回避するには、次の方法があります。

  1. 文字の後ろに、"\" を記入する。

    Perlスクリプトなどでも見かける方法ですが、2バイト目が 0x5c である文字の後に "\" を付加する事で回避することが出来ます。

    ex) print "ドミソ\"
  2. Raw文字列とする

    Raw文字列は、正規表現式などを記述する際に使用することの出来る文字列で、Raw文字列中ではエスケープ文字は特別な意味を持たない文字として評価されます。Raw文字列は、文字列の先頭に r を付加して記述することが出来ます。

    ex) print r"ソシレ"

    ただし、Raw文字列中ではエスケープ文字が使用できませんので、たとえば改行("\n") なども使用することが出来なくなってしまいます。また、Raw文字列を使用した場合でも、文字列の最後がバックスラッシュの場合はコンパイルエラーとなってしまいます。

    ex) r"ソ" ->  SyntaxError: invalid token
  3. SJIS対応パッチ版を利用する

    Windows環境では、SJISパッチ版Pythonを使用して問題を回避することが出来ます。

Unicode型

Python1.6以降ではUnicode文字列がサポートされていますので、日本語処理はUnicodeで行うのも一案です。

Codec

Codecとは、PythonでサポートされているUnicode文字列(UCS-2)と、それ以外の文字列とを相互に変換する為のPythonモジュールです。たとえば日本語環境でのEUC-JP<->UnicodeやShift JIS<->Unicodeの変換、あるいはUTF-8<->UCS-2の変換などを行います。

現在、日本語処理に使用することのできるCodecは2種類存在します。

  1. JapaneseCodec

    梶山氏によるCodecモジュールで、EUC-JP/ShiftJIS/JIS をサポートします。

  2. mbcs

    Pythonに標準で組み込まれているCodecですが、Windows環境専用です。Win32のUnicode APIを使用して、システムのデフォルトコードページとUnicodeを変換しますので、日本語環境ではShiftJIS(CP932)用のCodecとして使用することができます。

使い方

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")
とすることで対応することが可能です。

印刷用ページ
Copyright © 2001-2012 Python Japan User's Group.

警告当サイトの文書・画像等のコンテンツの著作権は、各コンテンツの作成者、もしくは日本Pythonユーザ会に帰属します。
 また、日本Pythonユーザ会はサイト内のコンテンツに他のプログラミング言語からの乗り換えを誘発する恐れのある表現が多々あることを認め、予めお詫び申し上げます。