Shift_JIS ? UTF-8 ? Internet Explorerの不思議な挙動
お仕事中、お客様から電話が入った。こちらから納品したHTMLが文字化けするのだという。UTF-8で作ってあるから、Internet Explorerの「表示」→「エンコード」で「自動選択」にチェックを入れてくださいということでお茶を濁したつもりだった。しかし...
そうすると、今度はお客さんのイントラネット上のデータが文字化けするのだそうだ。
そもそもこちらのデータはMETAタグで charset="UTF-8" を指定しているのだから、「自動選択」になっていてもいなくても「UTF-8」で表示されなければおかしいはずなのだ。実際、Firefoxでは問題なく表示できている。
さらにもう一つ言わせてもらうと、「自動選択」にしたことでお客さんのイントラネットのデータが化けるのもおかしな話なのだ。
というわけでIEの文字コードに関する挙動を調べたら、色々と奇妙なことが判明した。
まず、IE6から。
UTF-8でHTMLを作成する。ただし、文字コード宣言の前に日本語文字を入れる。
例えば
日本語
というようにしておく。
エンコードを「自動選択」にしておかないとIE6はこれをShift_JISとして認識。ページは文字化けを起こしてしまう(おかしい)。
エンコードを「自動選択」にすると、IE6はこれをUTF-8として認識。ページはきれいに表示される(期待通り)。
しかし、上記のHTMLのとを入れ替え、文字コード宣言の前に日本語の文字が入らないようにすると、エンコードがどうなっていようとIE6はこれをUTF-8として認識。ページはきれいに表示される(期待通りだが...???)
じゃあ、とにかく文字コード宣言の前に日本語の文字を入れなければいいのかと思い、先にMETAタグを置いたファイルを作ってIE7で試してみると、今度は「自動選択」を外した場合に文字化け。挙動が違う。
で、さらなる情報を求めてネットを検索していると
http://support.microsoft.com/kb/413581/ja
というページに行き当たった。
1.IEは、HTMLで文字コード宣言がある場合はその文字コードを使用する
2.HTMLで文字コード宣言がない場合は、「エンコード」メニューでユーザーが最後に指定した文字セットが使用される。
2-1.「エンコード」でユーザーが最後に選択したのが「自動選択」であった場合、IEは表示可能なありとあらゆる文字セットの中から、そのページを表示するのに適切と思われる文字コードを自動的に選択する
2-2.「エンコード」でユーザーが最後に指定したのが「日本語(自動選択)」であった場合、IEはJIS、Shift_JIS、EUCのいずれかから、もっともそのページを表示するのに適切と思われる文字コードを自動的に選択する(UTF-8は候補に含まれていない!)
ということらしい。
これと、今日の実験結果を付き合わせると、文字コード宣言以前に日本語の文字が見つかると、IE6はそのページで「文字コード宣言はなされていない」ことにしてしまうらしい。IE7に至っては何をどう判断しているのかまったく不明だ。
さらに、今日のテストにおいて、条件分けが足りていないことも判明した。
IE6のテストにおいても、IE7のテストにおいても、「最後に選択してあったエンコードが何であったか」にまったく注意していなかった。
明日以降、Internet Explorerのこの挙動について、さらに調査を加えたいと思う。
そうすると、今度はお客さんのイントラネット上のデータが文字化けするのだそうだ。
そもそもこちらのデータはMETAタグで charset="UTF-8" を指定しているのだから、「自動選択」になっていてもいなくても「UTF-8」で表示されなければおかしいはずなのだ。実際、Firefoxでは問題なく表示できている。
さらにもう一つ言わせてもらうと、「自動選択」にしたことでお客さんのイントラネットのデータが化けるのもおかしな話なのだ。
というわけでIEの文字コードに関する挙動を調べたら、色々と奇妙なことが判明した。
まず、IE6から。
UTF-8でHTMLを作成する。ただし、文字コード宣言の前に日本語文字を入れる。
例えば
というようにしておく。
エンコードを「自動選択」にしておかないとIE6はこれをShift_JISとして認識。ページは文字化けを起こしてしまう(おかしい)。
エンコードを「自動選択」にすると、IE6はこれをUTF-8として認識。ページはきれいに表示される(期待通り)。
しかし、上記のHTMLの
じゃあ、とにかく文字コード宣言の前に日本語の文字を入れなければいいのかと思い、先にMETAタグを置いたファイルを作ってIE7で試してみると、今度は「自動選択」を外した場合に文字化け。挙動が違う。
で、さらなる情報を求めてネットを検索していると
http://support.microsoft.com/kb/413581/ja
というページに行き当たった。
1.IEは、HTMLで文字コード宣言がある場合はその文字コードを使用する
2.HTMLで文字コード宣言がない場合は、「エンコード」メニューでユーザーが最後に指定した文字セットが使用される。
2-1.「エンコード」でユーザーが最後に選択したのが「自動選択」であった場合、IEは表示可能なありとあらゆる文字セットの中から、そのページを表示するのに適切と思われる文字コードを自動的に選択する
2-2.「エンコード」でユーザーが最後に指定したのが「日本語(自動選択)」であった場合、IEはJIS、Shift_JIS、EUCのいずれかから、もっともそのページを表示するのに適切と思われる文字コードを自動的に選択する(UTF-8は候補に含まれていない!)
ということらしい。
これと、今日の実験結果を付き合わせると、文字コード宣言以前に日本語の文字が見つかると、IE6はそのページで「文字コード宣言はなされていない」ことにしてしまうらしい。IE7に至っては何をどう判断しているのかまったく不明だ。
さらに、今日のテストにおいて、条件分けが足りていないことも判明した。
IE6のテストにおいても、IE7のテストにおいても、「最後に選択してあったエンコードが何であったか」にまったく注意していなかった。
明日以降、Internet Explorerのこの挙動について、さらに調査を加えたいと思う。
この記事へのコメント
まったく同じ問題で悩んでいましたので大変助かりました。
ありがとうございます。
次のサービスパックでIEの挙動がまた変わってしまわないことを祈らないといけませんね。
情報提供に感謝いたします。
なんとも、MSIEは独自に走りすぎな気がしますね。
個人のメモ書きを公開して意味があるのだろうかと思っていましたが、意外とこの記事は役に立っているようですね。実験した甲斐がありました。
MSIEは6と7で挙動が違うのがまた困りものなのですよね。
おかげさまで解決できました。大変感謝しております。
ありがとうございます。
でも、意図するところは伝わっているようですので、これでもいいのですよね、イザワさん。
htmlを保存するときに「UTF-8N」とかに出来ませんか。
通常これでいけるかと思いますが...
BOMをつけると、手元のIE6では、エンコードの設定がどうなっていようとも、UTF-8で表示されるようですね。BOMをつけるのが有効な解決策ということですかね。
しかし、非推奨といわれても、お客さんが社内で非推奨のことをやられている場合、こちらとしては手の出しようがないわけでして。だからこういった調査が必要になるわけです。ご理解ください。