たとえば、ユニコードを無視して文字を書く
#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()の環境依存解決版