HTML5を使うならHTTPヘッダで文字符号化方式を指定しよう

HTML文書を公開するとき、通常はHTTPヘッダで Content-Type を送信することにより文字符号化方式を指定します。UTF-8の場合、次のようになります。

Content-Type: text/html; charset=UTF-8

また、HTMLのmeta要素を使って指定することもでき、次のように書きます。

<meta http-equiv="content-type" content="text/html; charset=UTF-8" />

HTML5では、charset属性(W3C) を使って次の書き方もできるようになりました。

<meta charset="UTF-8" />

ところが、一部のブラウザはこれを認識しないようです。たとえばこんなHTMLの場合。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<title>HTML5を使うならHTTPヘッダで文字符号化方式を指定しよう</title>
</head>
<body>
<p>この文書の文字符号化方式は UTF-8 です。</p>
</body>
</html>

これをLynxで読み込ませると、こうなります。

meta要素のcharset属性に対応していないLynxでの表示例

Shift_JISで表示させようとしているのですかね。コンテンツ部分が「縺薙・譁・嶌縺」(以下略)と見事に文字化けしてしまいました…。

残念なことに、このような状態になっているサイトは少なくありません。勢い勇んでHTML5を導入する前に、きちんと互換性の検証を行ってほしいものです。

もちろん、HTTPヘッダで Content-Type を指定してやればこのような事態にはなりません。もしサーバーがApacheで動いているのなら、AddType ディレクティブ(httpd.apache.org) を使って次の一行を書けば解決です。

AddType "text/html; charset=UTF-8" .html

レンタルサーバーなどで、 httpd.conf を書き換えたり .htaccess の設置ができない場合は…、仕方がないのでmeta要素のhttp-equiv属性を使った旧来の方法で指定するしかないでしょうね。