Smartyで文字コードの違うPHPをincludeせなあかん時
子供の好き嫌いは(除アレルギー)、料理が下手か、甘やかせすぎか、親が美味しそうに食べてないか、Loveスパイスが入ってない(キモッ)か、のどれかだと思います。うちは食育を大事にします。
さてさて閑話休題。
既に稼働済みのシステムが内部エンコードはUTF-8で最後にShift_JISに変換して出力する仕組みをSmarty使ってやってた時、後から文字コードがEUCの別PHPを組み込んで下さい、とクライアントから連絡来た時に悩んだ時の記録。
クライアントからは
<? include("path/to/hoge.php"); ?>
を挿入して下さい、という連絡が。
Smartyには{include}というタグがあるので、文字コードが同じであればコレで行けたはず。
しかし今回はUTF-8で作ってあって、最後にfetchしてその出力をShift_JISに変換して最終出力するという荒技をやってたので、上記の方法を使うとUTF-8の中にEUCが入ってきて、それをShift_JISに変換するもんだから、もう何が何やら。DBとの絡みもあって、内部エンコードをEUCに変更するのはアレだし、DBからの変数をいちいちEUCに変更するのはもっとアレ。
ということで、この状況を打開すべく試行錯誤の末に辿り着いたのが以下の方法。
{include_php file="path/to/hoge.php" assign=output}
{$output|mb_encoding:"UTF-8":"EUC-JP"}
{include_php}のassign指定で変数に出力を突っ込み、その変数をSmartyの中で文字コード変換してUTF-8に揃えちゃう。これでテンプレートの中身がUTF-8に統一されるので後はウマー。
ちなみにSmartyのプラグインを作らないといけないので、
<?
function smarty_modifier_mb_encoding($string, $to = "", $from="auto")
{
if ($to == "")
return "";
return mb_convert_encoding($string, $to, $from);
}
?>
として、modifier.mb_encoding.phpというファイル名でプラグインディレクトリに保存します。
タブン別のもっといい解決策もあるかと思うけど、日曜の深夜に泣いた防備録として。