文字コードとか

Joel on softwareは確か2年前の冬くらいにWebで翻訳版が公開されていて、それを印刷して何度も読み返していましたが、実は書籍版は持っていなかったのでつい最近購入、読了。やっぱり面白く読めます。まだ読んでない人はぜひ読んでください。ちなみに以下のリンクから買ってくれるとこの地球上の誰かが喜びます(俺です)。

Joel on Software

Joel on Software

当時はWebで翻訳されていなかった話もいくつか収録されていたのですが、その中の

「ソフトウェ開発者なら絶対に最低限知っていなければならないユニコードと文字セットについて(言い訳はなしですよ!)」
http://www.t3.rim.or.jp/%7eyoko-k-h/java/servlet/2008/01/31/unicode-and-character-sets-translation.html

の章はすごくわかりやすくてためになった。
たとえばwindowsのメモ帳で以下のように記述して保存する。

aaaa

これはWindowsのデフォルトエンコーディングであるWindows-31Jで保存される。次にこのファイルを適当なバイナリエディタで開いてみると、

61 61 61 61

こういうバイト列が保存されていることがわかる。
次にサクラエディタなどを使って同様の文字列"aaaa"をUTF-8で保存し、再度バイナリエディタで開く。すると以下のように表示される。

61 61 61 61

このように、英語のテキスト(というかユニコードのコードポイントのU+0000〜U+007f(0-127)に割り当てられている文字列)はASCIIとUTF-8で同じバイト表現になる。
一方で、

のような日本語を含むテキストをWindows-31Jで保存すると、

82 A0

というバイト列で保存されるが、これをUTF-8で保存すると、

E3 81 82

というバイト列で保存され、コードポイントU+0800(128)以上の日本語のテキストは、Windows-31JとUTF8で異なるバイト列として保存されるということがわかる。ちなみにE3 81 82をバイナリで表すと

11100011 10000001 10000010

と表現されるが、これはJoelのページに書いてあるとおり

1110vvvv 10vvvvvv 10vvvvvv

の形式に一致することがわかる。

紛らわしいのは、サクラエディタ等で文字コードセットにUTF-8を指定して英語のテキストを保存して、それを再度サクラエディタで開く場合。サクラエディタは、開くファイルの内容に応じてどの文字コードセットを使えばいいか自動的に判断してくれるが、上記のとおり英語だけのテキストの場合は、それがWindows-31JなのかUTF-8なのか判断がつかないので(というか同じバイナリデータなので)、自動的にデフォルトのSJISでファイルを開く。
(もっともサクラエディタは前回開いたときの文字コードセットの設定を覚えているので再度開いた場合は警告のダイアログが出るが)

http://d.hatena.ne.jp/wyukawa/20080208/1202481289
で指摘しているのも、おそらく上記のようなことだと思うのですが、いかがでしょう?>id:wyukawaさん