[PHP]文字コードが違うphpファイルをインクルードする

Read More

PHP tipsです。
※タイトルに文字コードと書いたが正しくは文字エンコード


読み込み元ファイルと読み込み先ファイルがそれぞれ異なる文字エンコードを使っている場合、普通にやるとインクルードすることができない。


まあそもそも文字エンコードを統一して作ればこんなことにはならないんだけど、UTF-8が流行る前に組んだような古いシステムとかだとしょうがない。


てことで、文字エンコードが違うphpファイルをインクルードする方法について以下に記す。



--
インクルードする方法は、結論から言えばeval()を使う。

でもeval()だけだと色々問題が残るので別の使い方の例も記す。


まず、読み込み先がphpファイルじゃなくHTMLファイルだった場合。

■UTF-8のphpファイルからShift_JISのHTMLファイルを読み込む
<?php
$html = file_get_contents('include.html');
print mb_convert_encoding($html, 'UTF-8', 'SJIS-win');
?>



include.htmlの内容は面倒なので省略するが、
うん、実に普通だ。



次に、両方ともphpファイルだった場合。

■UTF-8のphpファイルからShift_JISのphpファイルを読み込む_その1
<?php
$php = file_get_contents('include.php');
eval('?>'. mb_convert_encoding($php, 'UTF-8', 'SJIS-win'). '<?');
?>



■include.php
<?php
$sTemp = 'あいうえお';
// print mb_detect_encoding($sTemp);
?>

↑は読み込み先ファイル。これはなんでもいい。


先の例と見比べて見てもらえばわかるように違いはeval('?>'.$str.'<?')だけ。


ついでに上記とはまた別の方法。

■UTF-8のphpファイルでShift_JISのphpファイルを読み込む_その2
<?php
$php = file_get_contents('include.php');
ob_start();
eval('?>'. $php. '<?');
$str = ob_get_contents();
ob_end_clean();
print mb_convert_encoding($str, 'UTF-8', 'SJIS-win');
?>



その1とその2の違いはそれぞれ、
処理をShift_JISからUTF-8に変換してから行うか、
あるいはShift_JISとして処理を行ったあとの結果をUTF-8として受け取るか
の違いがある。

これは状況に応じて使い分けたい。


処理中の文字エンコードの様子が知りたいのならばコメントアウトしてある部分を戻して動かしてみればわかりやすい。

ふと思ったのだがコメントアウトを戻すのってなんて言うんだろ?



逸れた。



えーこれらの注意点としては、
・一連の処理を関数化しない
変数などのスコープの問題があるから。またはそれが問題になるならあえて関数化するもよし。

・読み込み先ファイル内で文字エンコードの変換を行っているかどうか

・$_POST, $_GETなどのスーパーグローバル変数を利用しているかどうか

・DBとのやりとりをしているかどうか

などがあげられる。


まあ文字エンコードの違うファイルをインクルードするには結構あちこち注意するべきとこがあるよってことだ。



最後にアドバイス的なことを一つ。


いらん心配ややっかいごとを抱え込みたくないのなら全ファイルの文字エンコードをそろえなさい。
修正する範囲が多くて時間もかかり、回り道に見えるかも知れないけど実はそれが解決への一番の近道。

先述した方法はあくまでも"一時しのぎ"でしかないことを覚えておくこと。


ま、実際文字エンコードの問題は自分自身が死ぬほど困ってみないとわからないってのも事実だが。




-- 2012/05/02 修正 --
文中の"文字コード"の表記の一部を"文字エンコード"に変更。
タイトルに対する注意文を追加。