このページでは,Python 2.7系における日本語処理について記述する. Python 3.x系については当てはまらないことが多いので,注意が必要である.
Pythonでは,日本語は次のような文字コードを使って扱うことができる.プラットフォームによって使う文字コードが違う.
特定のOS環境で使う場合にはその環境の標準の文字コードを用いるが,どの環境でも扱いたい場合にはUTF-8に統一するとよい.
なお,Pythonで扱える文字コードの一覧は,「Python標準ライブラリ」の「7.8.3. 標準エンコーディング」に示されている.
各コーデックには複数の別名が定義されているが,他のプログラムの処理や通信を考えて,できればIANAに登録されている文字コードの名前()を用いるのがよいだろう.
コーデック名 | IANA登録名 |
---|---|
utf_8 | UTF-8 |
shift_jis | Shift_JIS |
euc_jp | EUC-JIS |
iso2022_jp | ISO-2022-JP |
ソースコードの文字コードは次のように指定する.
例えば,windows用にcp932で記述したソースコードは次のようになる(source-cp932.py).# coding: エンコーディング名 # coding=エンコーディング名
Mac OS X用にUTF-8で記述したソースコードは次のようになる(source-utf8.py).# coding: cp932 print "こんにちは"
# 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
Pythonで文字単位を処理を行う場合には,Unicode文字列に変換する必要がある.
Unicode文字列は次のように生成する.Unicode文字数は3文字である.
>>> u=u"日本語" >>> u u'\u65e5\u672c\u8a9e' >>> len(u) 3 >>> print u 日本語
注:Windows版のIDLEでは,これは正しく動かない.
つまり,漢字,ひらがな,カタカナなどのアスキー文字以外の文字列を文字単位で処理する場合は,Unicode文字列を使わないと正しく処理することはできない.
任意の文字コードの文字列をUnicode文字列に変換するためには,decodeメソッドを用いる.
>>> '日本語'.decode('utf-8') u'\u65e5\u672c\u8a9e'
さらに,第2引数にエラー時の処理方法を指定できる.
この他に,unicodeメソッドも用いることができる.
>>> unicode('文字列', 'cp932') u'\u65e5\u672c\u8a9e'
Unicode文字列から任意の文字コードの文字列に変換するためには,encodeメソッドを用いる.
>>> u'日本語'.encode('cp932') '\x93\xfa\x96{\x8c\xea' >>> u'日本語'.encode('utf-8') '\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e'
さらに,第2引数にエラー時の処理方法を指定できる.
プログラムの入出力に使われている文字コードは,次の変数に格納されている.
次のプログラムを実行すれば,各変数の値を出力できる(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()