Shift_JISとUTF-8

ASP.NET用の自動生成ツールを作っていてaspxのファイルの先頭につねに ソ<@ Page と表示されていてコンパイルが通らん。
サクラエディタUTF-8からShift_JIS文字コード変換するとファイルの先頭になんかごみが表示されたのでバイナリエディタUTF-8のファイルをみて EF BB BF が<の前に入っていることを知る。
これで google に聞くキーワードがわかったので google で調べてUTF-8の仕様だと知る(マイクロソフトの独自仕様なのかと疑っていた。CA FE BA BE に対抗したのかと。。。)。

UTF-8とはなにか
http://www.anecs.net/comp/develop/data/utf.htm
エンコーディングの話 Part 2 (ディベロッパー製品開発統括部 Blog)
http://www.exconn.net/Blogs/team01/archive/2005/10/19/4042.aspx

Visual Studio 2005はBOM(Byte Order Marking)という3バイト(EF BB BF)を入れたファイルをUTF-8として扱っている(XMLはさすがに除くそうだ)。
これがUTF-8の仕様だそうだ(BOMなしをUTF-8nということもあるそうです)。
BOMってきいたことはあったがさすがにUTF-8になれば全ての問題が解決しているのかとおもっていたので私の脳内では見なかったことになっていた。
UTF-8対応のエディタはこの文字を表示しないから気がつかない。

'ソ'んなばかな。。。って感じだ。
とりあえずBOMを削除してもVisual Studio 2005で文字化けしていないのでまあいいやとおもっていたが
aspxファイルを実行してブラウザからアクセスすると文字化けする。EF BB BFを追加したら文字化けはしなくなった。
よってRubyのerbで以下のようなメソッドで変換するようにして回避することにした。
テンプレートファイルはShift_JIS。生成されるファイルはUTF-8(BOMつき)

def sjis2utf8(src, dest, data)
    File.open(dest, "w") { |out|
        out.print "\xEF\xBB\xBF"
        File.open(src) { |fh|
            erb = ERB.new(fh.read)
            out.print Kconv.toutf8(erb.result(binding))
        }
    }
end

C# ←→ Java とのWebサービスの時にはさすがにこういうことはないんだろうな。怖い怖い。

他にも
shift_jisとMS932(再々)
http://d.hatena.ne.jp/Kazzz/20060908/p1
見たいなイヤーンな問題もある。
JavaSJISWindows-31Jのイヤーンな問題もあり、JDK 1.3から1.5へのマイグレーションで付き合うことになる。

文字コード問題が解決されることってないように感じる今日この頃。