トップページ | 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.3 or later)

皆さんがPythonを使いはじめるとき、なんと言っても気になるのは「ちゃんと日本語使えるのかなぁ」ということではないかと思います。 結論から言えば、現在のPythonは日本語環境で利用可能です。 しかし、快適に日本語を使うためには、ちょっとした準備が必要です。 ここでは、Python 2.3 を基本に説明を行います。

Python の文字列型

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

ただし、スクリプト内に文字列定数を書く場合には注意が必要です。 Python インタプリタはソースコードがどんな文字エンコーディング方法を使って記述されているのかを認識します。 Python インタプリタにそれを認識させるには、ソースコードの記述者が直接文字エンコーディング方法を指定する必要があります。 何も指定しない場合、ソースコードは ASCII で書かれていると見なされます。

指定された文字エンコーディング方法にそぐわないバイト表現が文字列定数内にあった場合、Python は DeprecationWarning を出します。 現状では特に問題を起こしませんが、将来のバージョンでは警告ではなくエラーにして使えなくしてしまう予定なので、次のような方法できちんと記述することをお勧めします。

ソースコードのエンコーディング指定

ソースコードのエンコーディングを定義するには、ソースコードの一行目か二行目に次のように書きます。

# coding: エンコーディング名
# coding=エンコーディング名
「エンコーディング名」の部分は、実際のエンコーディング名に置き換えて記述して下さい。 なお、この指定は Python 2.3 以降から有効です。 これより前のバージョンでは、単なるコメントと見なされ、エンコーディング指定としては機能しません。

JapaneseCodesc をインストールすると、日本人におなじみの euc-jp, iso-2022-jp, shift_jis も使えます。 CJKCodecs をインストールすると、日本語のコーデックの他に、中国、韓国のコーデックも利用可能になります。 また、Python 2.4 以降は、CJKCodecs が Python 標準配布物に含まれ、新たなコーデックの追加インストールも不要になりました。

前後には余計な文字列を書くこともできます。 Emacs 使用者は

# -*- coding: euc-jp -*-
のように、Vim 使用者は
# vim: fileencoding=euc-jp
のようにするといいでしょう。

Shift_JIS などで、2 バイト目が「\」と同じ値の文字がある場合でも、適切なエンコード指定が行われている限り、エスケープなどの処理は必要ありません。

なお、このエンコーディング指定には、現在以下の問題があります。

  • ASCII 文字以外が書かれた行でコンパイルエラーが出ると、エラーメッセージが化ける
  • Universal new line が効かなくなるので、例えば Windows で改行コードが \r のみのスクリプトが実行できない

Unicode型

Python 1.6 以降では Unicode 文字列がサポートされていますので、日本語処理は Unicode で行うのも一案です。 Unicode でない文字列では、中身は単なるバイト列として扱われているので、2 バイト文字 1 文字が 2 文字に換算されるなどの問題があります。 Unicode 文字列では、内部表現に Unicode (version 3.2) を用いることで、1 文字をきちんと 1 文字として処理することができます。

Codec

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

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

  1. JapaneseCodecs

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

  2. mbcs

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

  3. CJKCodecs

    Hye-Shik Chang 氏による Codec モジュールで、その名の通り中国・日本・韓国の文字コードをサポートします。

使い方

Unicode の文字列定数は、次のように記述します。

ustr = u"これはUnicode文字列です"
ソースコードのエンコーディング指定を認識し、自動的に Unicode に変換されます。 明示的に指定したい場合には、次のように書く必要があります。
ustr = unicode("これはUnicode文字列です", "euc_jp")

また、Unicode 文字列を他のエンコードへ変換するには、encode() メソッドを使用します。

print ustr.encode('euc_jp')
引数には適切な Codec 名を渡して下さい。

Unicode 文字列は 1 文字を 1 文字としてきちんと認識しますが、普通の文字列は単なるバイト列として扱います。 そのため文字列の長さを求めようとした場合、結果に違いがありますので注意して下さい。

>>> print len('あいうえお')
10
>>> print len(u'あいうえお')
5

デフォルトエンコーディング

unicode() や encode() で引数を省略した場合、デフォルトでは ascii 用 Codec を使用して変換されます。 省略時に別の Codec を使用するには Python ライブラリディレクトリにある site.py の

encoding = "ascii" # Default value set by _PyUnicode_Init()
encoding = "euc_jp" # Default value set by _PyUnicode_Init()
などのように書き換える必要があります。

このように指定しておけば、

jstr = unicode("日本語")
print jstr.encode()
ではEUC-JP文字列として正しく変換されるようになります。 さらに encode() を省略して、
print jtr
と書くこともできます。

正規表現

Python では正規表現は re モジュールとしてサポートされています。 しかし、re はマルチバイト文字列に対応しておらず、日本語混じりのテキストを扱う場合には Perl などと同じような注意が必要となります。

しかし、re モジュールは Unicode 文字列をサポートしてますので、日本語を使用する場合は Unicode 化して使用すると良いでしょう。

import re
re.findall(u"[あ-ん]+", u"あめんぼ赤いなあいうえお")

のように、Unicode 文字列であれば日本語でも問題なく処理することができます。 ただし、Unicode プロパティや Unicode スクリプトは扱えないようです。

ファイル名操作

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-2009 Python Japan User's Group.

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