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でもPHPでPerlでも配列をPrintしたら日本語フォントに変換してくれるのにユニコードの番号が丸見えになるPythonはちょっと弱いのかな。
解決方法はあるんだろうか。
いまのところ、文字コードの扱いは、PHPのmbstring パッケージが最強だと思う。。。
*1:正確には__repr__()。toString()の環境依存解決版