文字化けの補足
問題 http://d.hatena.ne.jp/nishiohirokazu/20090219/1235039106
解答 http://d.hatena.ne.jp/nishiohirokazu/20090223/1235369658
文字化けクイズが書いてあるんだけど、じゃあなんでそんな化け方を起こすのかって話を少し。
ちなみに私も詳しいわけではないのでしったかが適当にほざいてると思ってください。
コンピュータのデータにおける文字の扱いについて
コンピュータにデータを保存するとき、通常文字とか絵をそのまま保存できる訳じゃない、ってのはいいよね。だめならあとで解説するけど。
コンピュータで文字をデータとして持つ時、文字に対応した数値として保存されます。aなら97番、0なら48番とか。これって97っていう数値がaになるような理由が特にあるわけではなく、単に表と照らしあわせて97がaと定義してるに過ぎません。この表はASCII文字コード表とか言われています。
日本語文字の表はいくつかある
アルファベットなら対応させる表はASCIIのみなので特に問題ないのだけど、それ以外の文字、例えば日本語だといくつか表(=文字コード)があるため、ひとつの数値が表によって違う文字になる、これが文字化けのひとつの原因。
例えば先の問題の問1なんかだと、
>>> s = u"こんにちは" >>> s.encode("utf-8") '\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf'
>>> s2 = u"縺薙" >>> s2.encode("sjis") '\xe3\x81\x93\xe3'
という感じで、どちらもe3 81 93 e3とかいう値なんですわ。(\xは16進数の意味)
#ところでこれ、ipythonでやってみたらsjisのencode出来ないんだけどなぜなんだろ?
e3 81をutf-8で見れば「こ」であって、sjisなら「縺」になるわけで。