Python で日本語を扱う際の諸注意、Tips をまとめました。
ソースコード中に日本語を書く
試しにコメントに日本語を使ってみましょう
#!/usr/bin/env python
# テスト
print 'hoge'
実行してみましょう。
$ python test.py
SyntaxError: Non-ASCII character '\xe3' in file test.py on line 3,
but no encoding declared; see http://www.python.org/peps/pep-0263.html
for details
Python はデフォルトだとソースコード中の文字列を ascii と想定して 処理を行います。そのため、マルチバイト文字を使うとエラーが発生します。
ソースコードの文字コードを指定する場合は下記の通りに書きます (UTF-8を使う場合)。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# テスト
print 'hoge'
二行目に # -- coding: utf-8 -- と追記しました。これによって、このスクリプトが UTF-8 で書かれていることを宣言しています。
$ python test.py
hoge
適切に実行されました。
Unicode 文字列に変換する
文字列の節で紹介したように、文字列には通常の文字列の他にUnicode 文字列があります。
その違いを見るために、以下のソースを実行してみましょう。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# テスト
hoge = 'ほげ'
u_hoge = u'ほげ'
print '通常の文字列: ', len(hoge), hoge
print 'Unicode 文字列: ', len(u_hoge), u_hoge
実行結果は以下のようになったはずです。
通常の文字列: 6 ほげ
Unicode 文字列: 2 ほげ
どちらも文字列の長さは 2 のはずですが、通常の文字列は何故か 6 と表示されています。実は通常の文字列はバイト単位でカウントされるため、このような結果になってしまいます。
例えばスライスの結果もおかしくなってしまいます。
print hoge[1] ## 文字化け
print u_hoge[1] ## 「げ」が表示される
そのため、文字列に対して何かしらの処理を行う場合は Unicode 文字列に変換する必要があります。
文字列を変換する場合のメソッドをそれぞれ示します。
>>> hoge = 'ほげ'
>>> u_hoge = unicode(hoge)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128)
>>> u_hoge = unicode(hoge, 'utf-8')
>>> u_hoge = hoge.decode('utf-8')
>>> hoge = u_hoge.encode('utf-8')
>>>
文字コードを指定しないと Python は ascii だと想定して変換しようとするので、 ちゃんと文字コードを指定してあげましょう。
扱う文字コードを常に UTF-8 にする
とは言っても、毎回文字コードを指定するのは面倒です。 そこで、Python が文字列を変換する際のデフォルト文字コードを ascii から UTF-8に置き換えましょう。
そこで、まずは sitecustomize.py というファイルを作成し、以下の内容を記述してください。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
sys.setdefaultencoding('utf-8')
次に、以下のコマンドを実行してみてください。
python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
おそらく site-packages というディレクトリの絶対パスが表示されたはずです。そのディレクトリに、先程作成した sitecustomize.py を cp してください。
これで、文字列を変換する際のデフォルトの文字コードが UTF-8 へと変更されました。
>>> hoge = 'ほげ'
>>> u_hoge = unicode(hoge)
>>>
おそらく、エラーは起こらないはずです。
site-packages は、サードパーティ製のライブラリが保存されるディレクトリです。何かの際に覚えておくと便利かもしれません。