White scenery @showyou, hatena

If you have any comments, you may also send twitter @shsub or @showyou.

文字化けの補足

問題 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文字コード表とか言われています。

http://e-words.jp/p/r-ascii.html

日本語文字の表はいくつかある

アルファベットなら対応させる表は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なら「縺」になるわけで。

さらに面倒な問題

ASCIIなら1文字=1バイトなんだけど、shift-jisだと2バイト、utf-8だとそれ以上になったりするから問題。

「ファイルが見つかりません」と表示されるはずなのに
なお参考までに表示された文字列は20文字

ファイル(ryは12文字なのに表示される文字が20文字なのは、shift-jisとutf-8で1文字の区切りが違うから。