現在作成中のPHPスクリプトを複数のレンタルサーバに配備する予定です。
テンプレートエンジンに、Smarty を使い、テンプレートファイル(HTML),PHPファイル共に文字コードは UTF-8 を使用予定で、その文字コードで記述しています。
で、とあるレンタルサーバはPHP,apache共に文字コードが EUC-JP となっていました。
テンプレートファイル(HTML)はメタタグで下記のように文字コードは指定しています。
http-equiv="Content-Type" content="text/html; charset=UTF-8">
なのに、表示すると文字化けしました。
メタタグで、UTF-8に設定したHTMLファイルだけだとちゃんとUTF-8で表示されます。
文字化けするレンタルサーバからのHTTPのヘッダ情報を FireBug を使ってみてみるとこうなっていました。
Content-Type: text/html; charset=EUC-JP
どうやら、HTTPヘッダのContent-Typeが有効になっているようです。
@IT:Webブラウザが文字コードを判定する基準は?を見ると、ブラウザは HTTPにおけるContent-Typeヘッダのcharsetパラメータ → HTML文書内のMETA宣言Content-Typeヘッダのcharsetパラメータ → HTML文書内の各要素のcharset属性 という順序で、文字コードを決定するようです。
レンタルサーバによってはHTTPヘッダに文字コードを埋め込んでるところもあるようなので、そういう場合は、こちらでHTTPヘッダを変えてるやる必要があるようです。
ということで、PHP 側で、下記を追加することで解決しました。
レンタルサーバのPHPの既定のエンコーディングが、自身の意図しているものと違う場合は、上記の header と共に下記も指定しておくといいかもしれませんね。
mb_language("Japanese");
ということで、util.phpみたいなのを用意し、メインのPHP側に読み込ますような感じとしました。
○util.php
/**
* 初期化処理。
* 文字コードの設定。
* 各ページの最初に呼ぶこと。
*/
function Init(){
header("Content-type: text/html; charset=UTF-8");
mb_language("Japanese");
mb_internal_encoding("UTF-8");
}
/**
* ログインしているかのチェックを行う。
* セッションも開始する。
* ログインしていなければログインページに飛ばす。
*/
function LoginCheck(){
//認証できてなければログインページへ
if ( ! isset( $_SESSION["username"] ) ){
exit;
}
}
?>
○index.php
require_once 'util.php';
//初期処理
Init();
..処理、Smarty呼び出し、描画
?>
後、ヘッダ系の関数使うときは、その間数より前に出力をしていると下記のようなエラーとなります。
Warning: Cannot modify header information - headers already sent by (output started at C:\...\util.php:10)
in C:\...\util.php:10
特に、今回の util.php のような共通関数の入ったPHPを作る時は、の範囲外に空白や改行や文字を入れないようにしなければならりません。
例えば下記はNGのようです。
// 共通関数
?>
[EOF]
下記のようにすべきです。
// 共通関数
?>[EOF]
久しぶりのPHPとだけあって、結構ハマってます。。。。
参考: