それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Pythoのデフォルトエンコード

たとえば、ユニコードを無視して文字を書く

#coding=shift_jis
items = [ ["日本語", "ja"], ["英語", "en"], ["フランス語", "fr"]]
for i,j in items:
    print i,j

###出力###
#日本語 ja
#英語 en
#フランス語 fr

これは通る、一方で次のコードはユニコードが変換されなかった。

#coding=shift_jis
items = [ ["日本語", "ja"], ["英語", "en"], ["フランス語", "fr"]]
for item in items:
    print item

###出力###
#['\x93\xfa\x96{\x8c\xea', '1']
#['\x89p\x8c\xea', '2']
#['\x83t\x83\x89\x83\x93\x83X\x8c\xea', '3']

このコードの違いは、文字列オブジェクトを参照しているどうか。

後の例は、list オブジェクトを参照して、先の例は文字列オブジェクトを参照している。

もう少し言うと、

先の例は、文字列オブジェクトの__str__()*1を利用しているようで、後の例は、Listオブジェクトの__str__を利用してる。

文字列を出力するときは、適切な形式を選んでくれるreprだが。全てにおいて適用されるわけではないようで。。。JavaScriptでもPHPPerlでも配列をPrintしたら日本語フォントに変換してくれるのにユニコードの番号が丸見えになるPythonはちょっと弱いのかな。

解決方法はあるんだろうか。


いまのところ、文字コードの扱いは、PHPのmbstring パッケージが最強だと思う。。。

*1:正確には__repr__()。toString()の環境依存解決版