[最終更新日:2011/01/29]
レンタルサーバではあまり問題ないとは思いますが、PHPのデフォルトの文字コードが設定されているウェブサーバでは、 しばしばPHPが吐き出すHTMLの文字化けが問題になっています。 これはLinux標準のEUC-JPに設定されているサーバで、utf-8のサイトを運営している場合に起こる文字化けの例です。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta http-equiv="Content-Language" content="ja" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<title>リッチなサイトを作ろう</title>
</head>
<body>
<?php
$name = "フジテレビ";
$zip = "135-0091";
$address = "東京都港区台場";
echo =<<<_
<div style="font-size:14px">
放送局:$name<br />
所在地:〒$zip<br />
$address</div>
_;
?>
</body>
</html>
これは、いくらコードをutf-8で記述していても100%文字化けして、日本語はまったく読めません。 ページのタイトルまで文字化けしています。 これも以下のように変更すればコードはEUC-JPでもSHIFT_JISでも、もちろんutf-8でも簡単に回避できてしまいます。
<?php
$name = "フジテレビ";
$zip = "135-0091";
$address = "東京都港区台場";
header("Content-Type:text/html; charset=UTF-8");
$html =<<<_
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta http-equiv="Content-Language" content="ja" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<title>リッチなサイトを作ろう</title>
</head>
<body>
<div style="font-size:14px">
放送局:$name<br />
所在地:〒$zip<br />
$address</div>
</body>
</html>
_;
echo mb_convert_encoding($html, "utf-8");
?>
1番の違いは、最初にHTML出力を行わず、PHPのスクリプト内5行目で出力する文字コードを宣言していることです。 また、htmlを直接出力しないで、1度変数$htmlに格納し、25行目で出力する文字コードにエンコードしています。 最後にエンコードしているのですからPHPスクリプト自体はutf-8で記述する必要も無いということです。 この手法も、全てのサーバで、全ての文字コードをサポートするPHPスクリプトを開発する上で非常に重宝します。 私はコードの読みやすさから見ても、こちらが上だと思います。