それマグで!

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

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

Python2.5の日本語問題

まだ片付かない。日本語。
Windows環境でもUTF-8で書くのが良いのか?おれはそうは思えない。


たとえば、こんなコード。
入れた文字を出力する

#encoding:utf-8
a = raw_input("なんかいれて?    : ")
print a

Windowsのcmd.exeから実行してみる

C:\pyhton>python jp.py
縺ェ繧薙°縺・l縺ヲ?    : シフトJIS
シフトJIS

期待通り化けてくれる。Pythonは期待を裏切らない。



化けた理由は? raw_inputが変換しない。


そして、入力文字が化けない理由は?


print 関数がシステムデフォルトにエンコードしてくれるから?それとも入ったまま出てきてるから?



じゃぁ、調べてみましょう。


日本語を比較する。

# -*- encoding: utf-8 -*-
a = raw_input("input something?:")
if( a == "あ"):
    print True
else:
    print False

実行すると

C:\pyhton>python jp.py
input something?:あ
False

Pythonは期待を裏切った。*1


さぁ、これはどういうことだろうね。


じゃぁ次にすべてshift_jisでやってみよう

# -*- encoding: shift_jis -*-

a = raw_input("input something?:")
if( a == "あ"):
    print True
else:
    print False

ちゃんと、shift_jis(ms932)を確認して、実行

C:\pyhton>python jp.py
input something?:あ
True

ちゃんとTRUEがでる。Pythonは期待を裏切らない。
さて、どういうことだろうね。


shift_jisでこんな風に書いてみる。

# -*- encoding: utf-8 -*-

a = raw_input("input something?:")
if( a == u"あ"):
    print True
else:
    print False

実行すると?

C:\Documents and Settings\takuya\デスクトップ\pyhton>python jp.py
input something?:あ
jp.py:4: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unic
ode - interpreting them as being unequal
  if( a == u"縺・):
False

ユニコード同士の比較じゃないぞ!!って注意された。*2



ここからわかったこと。

  1. string と unicode は全くの別物
  2. 1行目にencodingは必須
  3. print 関数は文字コードシステムにあわせて変更してくれる
  4. もしかして、Pythonにはinternal encodingの概念がない?

*1: ここまではUTF-8 BOMなし。

*2:正確にはユニコードを比較しようとしたけれど、片方の変数がユニコードに変換できませんでした、なので等しくないと解釈しますよ。当然US ASCIIならユニコードに変換できるので変換をtryしているんだと思う。tryするなら日本語の文字コードもtryして欲しいものだ