Pythonと日本語表示と文字コード、unicode 、str 、utf-8 、shift-jis 、、、

写真の人物と記事は一切関係ございませ

 Pythonは使いやすい覚えやすい気持ちいいとまで言う人もいる。たしかにその通りだと思った。しかし、日本語を使おうとした時に急に気持ち良くなくなる。そう感じたのは僕だけではないはずだ。
 ということで今日の日記のネタはPythonと日本語となりました。
(WindowsXPココから "Python 2.5.1 Windows installer" をインストールした環境でテストしています。)

  • まずは、あなたが書いたコードはutf-8で保存する。そして、そのコードの先頭には以下を記入する。
# -*- coding: utf-8 -*-

あなたはエディタに何を使っていますか? 秀丸、メモ帳、vimmeadow、或いは Python Scriptereclipse ? いずれにしてもファイルを保存する時のエンコードutf-8にすべし。

  • では早速気持ちよくない(表示が文字化けする!)例。
# -*- coding: utf-8 -*-

jstr = "日本語"
print jstr #日本語を表示してみる。 → 文字化けする。

ちょっと気持ちよくしてみる。

# -*- coding: utf-8 -*-

jstr = u"日本語"
print jstr #日本語を表示してみる。 → 文字化けしない。

違う方法で...

# -*- coding: utf-8 -*-

jstr = "日本語"
print jstr.decode('utf-8') #ASCII→utf-8 しているのでなく
                           #utf-8→unicode にデコードしている。
                           #文字化けしないで表示。

違う方法で... たぶんこれがいちばん混乱するところ。 utf-8unicodeに変換する。なんでこの一個上のサンプルはデコードで今回は変換なのか!

# -*- coding: utf-8 -*-

jstr = "日本語"
print unicode(jstr,'utf-8') #utf-8→unicodeに変換
                            #文字化けしないで表示。

この次はエラーになる。さっきファイルはutf-8で保存するべし!としてutf-8で保存してるからね。shift-jis→unicodeはエラーとなる。

# -*- coding: utf-8 -*-

jstr = "日本語"
print unicode(jstr,'shift-jis') #shift-jis→unicodeに変換
                                #これはエラーになる。

さらに、エンコードってのもある。
一番最後の四行が文字化けせずに表示できるのは私のwindowsのコマンドシェルのコードページが cp932 だから。あなたの環境でのコードページはコマンドラインで chcp とタイプして調べてください。

# -*- coding: utf-8 -*-

jstr = u"日本語"

print jstr.encode('iso-2022-jp')
print jstr.encode('euc-jp')
print jstr.encode('euc-jisx0213')
print jstr.encode('euc-jis-2004')
print jstr.encode('iso-2022-jp')
print jstr.encode('iso-2022-jp-1')
print jstr.encode('iso-2022-jp-2')
print jstr.encode('iso-2022-jp-3')
print jstr.encode('iso-2022-jp-ext')
print jstr.encode('iso-2022-jp-2004')

print jstr.encode('utf-7')
print jstr.encode('utf-8')
print jstr.encode('utf-16')
print jstr.encode('utf-16-be')
print jstr.encode('utf-16-le')

print jstr.encode('cp932')          #文字化けしない。
print jstr.encode('shift-jis')      #文字化けしない。
print jstr.encode('shift-jisx0213') #文字化けしない。
print jstr.encode('shift-jis-2004') #文字化けしない。

 今回は文字化けさせずに表示させるだけでもちょっと気持ちよくなったかなぁ。
次回につづく。
参考リンク:

参考図書:

Unicode標準入門
Unicode標準入門Tony Graham

翔泳社 2001-05
売り上げランキング : 167572

おすすめ平均 star
starISO/IEC 10646
starLocalization、Internationalizationの虎の巻です

Amazonで詳しく見る
by G-Tools
文字コード超研究
文字コード超研究
ラトルズ 2003-07
売り上げランキング : 95525

おすすめ平均 star
star隠れた名著
starまぁまぁ
star類似所の中では大変読みやすい書籍

Amazonで詳しく見る
by G-Tools