Safariと文字化け

こんな見出しをつけると不具合がまだたくさんありそうな印象を受けるかもしれませんが、今ではほぼ問題はなくなりました。そもそも、Safariでの文字化けの原因はほとんどHTMLファイル側の問題だったりします(フォームや文章の途中からの文字化けはSafariが原因ですが)。

  1. charset指定がされていない
  2. charset指定と内容が合ってない
  3. charset指定が間違っている(古い)

というのが文字化けを引き起こします。しかし、IEの自動判別は優秀なのであまり文字化けは起こらず、ほとんどの人は気づきません。ゆえに文字化けする少数派ブラウザが文句言われるわけです。自動判別の精度を上げればいいんじゃない?という話もありますが、そうはいかないんですよ(理由は後述)。

なぜこの話を出したかと言いますと、はてなアンテナではまだ文字化けします。これには微妙な問題があります。

  • はてな側:HTMLファイルにEUC-JP以外の文字が混入している
  • Safari側:エンコーディングを日本語にすると自動判別になるのはいいが、そのかわり、charset指定を無視してしまう。

はてなアンテナのcharset指定はeuc-jpです。内容もeuc-jp。どうやら他サイトから何文字分かを切り出すときに、それが2バイト文字の真ん中であってもぶった切ってしまいます。ぶった切られて残った1バイトがEUCとしては存在しないものになったとき、Safariエンコーディングの自動判別で他のcharsetと認識してしまい、文字化けが発生します。そもそも、自動判別は100%正確ではないです(IEであっても)。というか、文字コードの仕組み上、100%正しく認識するのは不可能のはずです。ゆえに、自動判別に頼るのは危険なんです。
さて、この場合、どうすればいいのか?。はてな側には切り出し方法の改善、Safari側にはcharsetがHTML的に正しい場合、自動判別よりcharsetを優先してもらうというのが一番よいのではないかと。両者ともそんなに難しくはないと思います。Safariはソースが公開されているので、数行書き換えるだけで変更できることを確認しています。

ちなみに、charsetは大文字(EUC-JP)でないとダメなのでは?という話もありますが、大小文字は区別しないことになっていますので関係ないです。試しにエディタでEUC-JPにするとなぜか文字化けしなくなったりするんですが、これはcharsetが効いたのではなく、上書きセーブするときにエディタ(miとか)がEUCにない文字を消しちゃったからです。バイナリエディタで確認できます。