3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(PHP)レンタルサーバで文字コード固定されている時の文字化け回避法

現在作成中の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 側で、下記を追加することで解決しました。

header("Content-type: text/html; charset=UTF-8");

レンタルサーバPHPの既定のエンコーディングが、自身の意図しているものと違う場合は、上記の header と共に下記も指定しておくといいかもしれませんね。

mb_language("Japanese");

mb_internal_encoding("UTF-8");

ということで、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(){

session_start();

//認証できてなければログインページへ

if ( ! isset( $_SESSION["username"] ) ){

header("Location:index.php");

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とだけあって、結構ハマってます。。。。

参考:

PHPでの質問です