Pythonの日本語処理

はじめに

このページでは,Python 2.7系における日本語処理について記述する. Python 3.x系については当てはまらないことが多いので,注意が必要である.

使える文字コード

Pythonでは,日本語は次のような文字コードを使って扱うことができる.プラットフォームによって使う文字コードが違う.

特定のOS環境で使う場合にはその環境の標準の文字コードを用いるが,どの環境でも扱いたい場合にはUTF-8に統一するとよい.

なお,Pythonで扱える文字コードの一覧は,「Python標準ライブラリ」の「7.8.3. 標準エンコーディング」に示されている.

各コーデックには複数の別名が定義されているが,他のプログラムの処理や通信を考えて,できればIANAに登録されている文字コードの名前()を用いるのがよいだろう.

コーデック名とIANA登録名
コーデック名 IANA登録名
utf_8 UTF-8
shift_jis Shift_JIS
euc_jp EUC-JIS
iso2022_jp ISO-2022-JP

ソースコードの文字コード指定

ソースコードの文字コードは次のように指定する.

# coding: エンコーディング名
# coding=エンコーディング名
例えば,windows用にcp932で記述したソースコードは次のようになる(source-cp932.py).
# coding: cp932
print "こんにちは"
Mac OS X用にUTF-8で記述したソースコードは次のようになる(source-utf8.py).
# coding: utf-8
print "こんにちは"

注:各ファイルは指定した文字コードで保存されていなければいけない.

実際には,エディタも文字コードを認識できる形式で書かれることが多い.

# coding: -*- utf-8 -*-
print "こんにちは"

デフォルトの文字コードの取得

デフォルトの文字コードは,sys.getdefaultencoding()で取得する(getdefaultencoding.py).

# coding: utf-8
import sys
# getdefaultencoding()で取得した文字コードを印字する
print 'defaultencoding:', sys.getdefaultencoding()

デフォルトの文字コードの変更

内部文字コードの変更にはsys.setdefaultencoding()を用いるが,通常は起動時に削除されて使えない.そこで,次のどれかの方法を用いる.

1, sysモジュールをリロードすることで,再びsetdefaultencoding()メソッドが使えるようになる(setdefaultencoding3.py).

import sys
# sysモジュールをリロードする
reload(sys)
# デフォルトの文字コードを変更する.
sys.setdefaultencoding('utf-8')
# デフォルトの文字コードを出力する.
print 'defaultencoding:', sys.getdefaultencoding()

2, Pythonを'-S'オプションで起動して(例,python -S program.py),内部文字コードを設定してからsiteモジュールを読み込む(setdefaultencoding1.py)

# coding: utf-8
# 注意: Pythonを-Sオプションで起動すること.
import sys
# デフォルトの文字コードを変更する.
sys.setdefaultencoding('utf-8')
# siteモジュールの読み込む.
import site
# デフォルトのエンコーディングを出力する.
print 'defaultencoding:', sys.getdefaultencoding()

なお,プログラムをPythonの引数として与える以外に,次のようなUnixのシェルスクリプトとして記述することもできる.

#!/usr/bin/python -S
# coding: utf-8
# 注意: Pythonを-Sオプションで起動すること.
import sys
# デフォルトの文字コードを変更する.
sys.setdefaultencoding('utf-8')
# siteモジュールの読み込む.
import site
# デフォルトのエンコーディングを出力する.
print 'defaultencoding:', sys.getdefaultencoding()

3, sitecustomize.pyというファイルに文字コードの設定を記述し,Pythonをインストールしたディレクトリの下にsite-packagesディレクトリに置く.例えば,Mac OS Xでは/Library/Python/2.7/site-packages/,WindowsではPython27\Lib\site-packages/である.

import sys
sys.setdefaultencoding('utf-8')

注:ただし,この方法はシステムのデフォルトを変えてしまうので,他のプログラムの挙動も変わったり,この設定をおこなっていない環境ではプログラムが正しく動かないことに注意する.

文字列

Pythonでは,文字列は8ビット単位で格納され,その文字符号化はプラットフォームによって異なる.

文字列は次のように生成する.

>>> s='日本語'
>>> print s
日本語

なお,プラットフォームにより,変数sにどのような値が入っているかは異なる.例えば,Mac OS Xでは,この文字列はUTF-8で符号化され,文字列長は9バイトである.

>>> s
'\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e'
>>> len(s)
9

Windowsでは,CP 932で符号化され,文字列長は6バイトである.

>>> s
'\x93\xfa\x96{\x8c\xea'
>>> len(s)
6

Unicode文字列

Pythonで文字単位を処理を行う場合には,Unicode文字列に変換する必要がある.

Unicode文字列は次のように生成する.Unicode文字数は3文字である.

>>> u=u"日本語"
>>> u
u'\u65e5\u672c\u8a9e'
>>> len(u)
3
>>> print u
日本語

注:Windows版のIDLEでは,これは正しく動かない.

つまり,漢字,ひらがな,カタカナなどのアスキー文字以外の文字列を文字単位で処理する場合は,Unicode文字列を使わないと正しく処理することはできない.

文字列からUnicode文字列への変換

任意の文字コードの文字列をUnicode文字列に変換するためには,decodeメソッドを用いる.

>>> '日本語'.decode('utf-8')
u'\u65e5\u672c\u8a9e'

さらに,第2引数にエラー時の処理方法を指定できる.

この他に,unicodeメソッドも用いることができる.

>>> unicode('文字列', 'cp932')
u'\u65e5\u672c\u8a9e'

Unicode文字列から文字列への変換

Unicode文字列から任意の文字コードの文字列に変換するためには,encodeメソッドを用いる.

>>>  u'日本語'.encode('cp932')
'\x93\xfa\x96{\x8c\xea'
>>>  u'日本語'.encode('utf-8')
'\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e'

さらに,第2引数にエラー時の処理方法を指定できる.

標準入出力の文字コードの取得

プログラムの入出力に使われている文字コードは,次の変数に格納されている.

  1. sys.stdin.encoding…標準入力の文字コード
  2. sys.stdout.encoding…標準出力の文字コード
  3. sys.stderr.encoding…標準エラー出力の文字コード

次のプログラムを実行すれば,各変数の値を出力できる(io-encodings.py).

# coding: utf-8
import sys
# 標準入力の文字コードを印字する.
print 'sys.stdin.encoding:', sys.stdin.encoding
# 標準出力の文字コードを印字する.
print 'sys.stdout.encoding:', sys.stdout.encoding
# 標準エラー出力の文字コードを印字する.
print 'sys.stderr.encoding:', sys.stderr.encoding

標準入出力の文字コードを変更することもできる.(change-io-encodings.py)

# coding: utf-8
import sys
import codecs
# 標準入力,標準出力,標準エラー出力の文字コードを変更する.
sys.stdin = codecs.getreader('utf-8')(sys.stdin)
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
sys.stderr = codecs.getwriter('utf-8')(sys.stderr)
# 設定された値を確認する.
print 'sys.stdin.encoding:', sys.stdin.encoding
print 'sys.stdout.encoding:', sys.stdout.encoding
print 'sys.stderr.encoding:', sys.stderr.encoding

ファイル入力

プログラム中で文字列として扱うファイル入力の例(fileread.py).

# coding: utf-8
import sys
# ファイル'text.txt'を読み込みモードでオープンする.
fin  = open('text.txt', 'r')
# ファイルから一行を読み込み,標準出力に出力する.
for line in fin:
    print line
fin.close()

プログラム中でUnicode文字列として扱うファイル入力の例(fileread.py).

# coding: utf-8
import sys
import codecs
# ファイル'text-euc.txt'(文字コードはEUC-JP)を読み込みモードでオープンする.
fin  = codecs.open('text-euc.txt', 'r', 'euc_jp')
# 標準出力の文字コードを変更する.
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
# ファイルから一行を読み込み,標準出力に出力する.
for line in fin:
    print line
fin.close()

ファイル出力

プログラム中で文字列として扱うファイル出力の例.

# coding: utf-8
import codecs
# ファイル'text.txt'を読み込みモードでオープンする.
fin  = open('text.txt', 'r')
# ファイル'text2.txt'を書き込みモードでオープンする.
fout  = open('text2.txt', 'w')
# ファイルから一行を読み込み,ファイルに出力する.
for line in fin:
    fout.write(line)
fin.close()
fout.close()

プログラム中でUnicode文字列として扱うファイル出力の例(filereadwrite.py).

# coding: utf-8
import codecs
# ファイル'text-euc.txt'(文字コードはEUC-JP)を読み込みモードでオープンする.
fin  = codecs.open('text-euc.txt', 'r', 'euc_jp')
# ファイル'text-utf8.txt'(文字コードはUTF-8)を書き込みモードでオープンする.
fout  = codecs.open('text-utf8.txt', 'w', 'utf-8')
# ファイルから一行を読み込み,ファイルに出力する.
for line in fin:
    fout.write(line)
fin.close()
fout.close()

関連ツール

参考資料


風間 一洋