2010年9月28日火曜日

ホームページを作ろう-1.7 補助情報を付加しよう

エンコーディングの謎

1.7 補助情報を付加しよう」の部分の補足です。
meta要素によるエンコーディングは、必ず指定するようにしましょう。
ここでは、その指定の謎をいくつかの例を交えて説明します。

まずは、「1.5 DTDを意識しよう」のサンプルについて考えてみましょう。なお、ここでは、Firefox を使用して例示していますが、他のブラウザでも同様のことができるので試してみてください。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<title>とにかく作ろう</title>
</head>
<body>
<p>初めてのWebページ</p>
</body>
</html>
このファイルをエンコーディング「UTF-8」で保存してブラウザで表示した場合、ブラウザの文字エンコーディングの設定が「自動判別(日本語)」になっていれば、XML宣言のエンコーディングを解釈して、正常に表示されます。
しかし、XML宣言のエンコーディングを「UTF-8」のままとして、ファイルの保存形式は「Shift_JIS」で保存した場合は、「文字化け」が発生して、正常に表示できません。
つまり、保存したファイルのエンコーディングとXML宣言のエンコーディングは必ず一致させるようにします。

次に、XML宣言を省略した場合について考えてみましょう。
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<title>とにかく作ろう</title>
</head>
<body>
<p>初めてのWebページ</p>
</body>
</html>
これも「自動判別(日本語)」が有効になっていれば、正常に表示されますが、「自動判別」が解除されている場合は、ブラウザのデフォルトエンコーディングが使用されます。つまり、ファイルのエンコーディングとブラウザのエンコーディングが一致する場合は、表示され、
そうでなければ表示されないことになります。次の表示例は、ファイルのエンコーディングは、「Shift_JIS」、ブラウザのデフォルトエンコーディングが「UTF-8」の場合です。

次にmeta要素を使用してエンコーディングを指定する例について考えてみます。ファイルを「UTF-8」で保存した場合は、以下のようにmeta要素を指定します。
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>

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

<title>とにかく作ろう</title>
</head>
<body>
<p>初めてのWebページ</p>
</body>
</html>
なお、XML宣言とmeta要素のエンコーディングが一致しない場合、多くのブラウザはmeta要素のエンコーディングを優先して解釈するようですが、これは文法としては誤りです。XML宣言を記述する場合は,XML宣言とmeta要素のエンコーディングを必ず一致させてください。

また、XML宣言を省略した場合は、必ずエンコーディング指定を「UTF-8」にする必要があります。例えば、XML宣言を省略して、ファイルを「Shift_JIS」で保存し、meta要素も「Shift_JIS」を指定した場合について考えてみます。
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta content="text/html; charset=Shift_JIS"
http-equiv="Content-Type" />

<title>とにかく作ろう</title>
</head>
<body>
<p>初めてのWebページ</p>
</body>
</html>
このときブラウザは、以下のように誤りがないかの如く表示します。

しかし、このファイルをW3Cの文法チェッカーでチェックすると、以下のように表示されます。

一見すると正常なようですが、実はmeta要素が強制的に書き換えられています。

特に注意してほしいのは、XML宣言にしろ、meta要素にしろ、どちらの指定方法であってもファイルの保存形式を変更することはできない、ということです。あくまでもXML宣言やmeta要素のエンコーディングは、ファイルの保存形式を明示することが役割ということになります。

以上のことから、今後、作成するファイルの一般形式は、「XML宣言なし」、ファイルを保存するときのエンコーディングは「UTF-8」で記述するものとします。
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta content="text/html; charset=UTF-8"
http-equiv="Content-Type" />

<title>とにかく作ろう</title>
</head>
<body>
<p>初めてのWebページ</p>
</body>
</html>

0 件のコメント:

コメントを投稿