プロが教えるわが家の防犯対策術!

サーバは自分で立てたcentOS5.4(i386版)を使用しており、そこでホームページの作成をしております。

ホームページは、PHP5+XHTML+CSS+JavaScriptを使用しており、それぞれ別ファイルで作成してあります。

アクセス先はPHPで、そのPHP内にテンプレートを表示する処理を記述してあるのですが、PHPで動的に表示した状態のソースを見ると、生のHTMLの内容と違った状態で表示されてしまいます。

生のHTMLと動的に出力したHTMLのソースは下記の通りです。

生のHTML
=================
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio …
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
<head>




動的のHTML
=================
?????????<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio …
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">




動的に出力した状態ですと、ソースの最初に"?????????"という文字が表示されてしまいます。

PHPやHTMLなど、全てのファイルは
文字コード:UTF-8
で、HTMLとCSSは
改行コード:CRLF
で、その他のPHPやJavaScriptは
改行コード:LF
で作成しております。

php内では、
まずテンプレートを"openFile"で開き、
文字列置換($bodyはテンプレートファイル)
$body = str_replace("\\", "\\\\", $body);
$body = str_replace("\"", "\\\"", $body);
eval("\$body = \"$body\";");
をして、最後に
mb_http_output("UTF-8");
header("Content-type: text/html;charset=UTF-8");
print($body);

としてあります。

文字コードの関係で文字化けを起こしているため、最初に"?????????"とソースに表示されてしまっているのかと思うのですが、どこが原因なのか分かりません。

原因がお分かりになる方、同じ現象になったことのある方いらっしゃいましたら、ご教授のほどお願い致します。

A 回答 (2件)

    • good
    • 0
この回答へのお礼

yambejpさん

ご回答、ありがとうございます。

仰る通り、BOMが原因でした。

そもそも、今までBOMという存在のことを知りませんでした。

PHPやHTMLなど、全て文字コードをUTF-8にしていたのですが、"UTF-8"はBOMが付いてくるということを知り、それら全てを"UTF-8N"に変更しました。

そうしたところ、ソースの最初に表示される???????というものがなくなりました。

また余談ではありますが、UTF-8の状態でBOMを無くすPHPのサンプルソースを配布しているサイトがいくつかありました。
どうしてもUTF-8でなくてはならない場合、そちらでも対応可能かと思います。

問題が解決でき、非常に助かっております。
どうもありがとうございました。

お礼日時:2011/03/08 06:49

力作業ですが、phpの各行にprint("1");などと入れていくと、犯人が分かるのでは


ないでしょうか?
    • good
    • 0
この回答へのお礼

Tasuke22さん

迅速なご対応、ありがとうございます。

問題ですが、ANo.2の方で解決することができました。
詳しくはそちらをご覧いただければと思いますが、原因は文字コードをUTF-8にしているためのBOMでした。

文字コードをUTF-8Nにすることで、対応することができました。

今回は上記の方法で解決できましたが、PHPの規模が大きくなるにつれて、どこでエラーが起きているのか分からなくなることがたまにあるかと思います。
そういったときなどに、printやexitなどを使うことは地道ではありますが、ときには必要だったりもしますよね。。

今後は、そういったデバッグもした上で、質問をしていきたいと思います。

どうもありがとうございました。

お礼日時:2011/03/08 06:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!