SJISページでのSmartyの使い方

SJISのWebサイトをSmartyを使って構築する際の注意点。

1.テンプレートファイル及びプログラムはEUC-JPで作成する。

SJISでテンプレートを作成すると、「必須」などの文字が含まれたりするとページ表示にエラーが発生する。これは「必須」という文字がSJISではバイナリで「\x95K\x90{」となり”{“という文字がSmarty内での定義後として扱われてしまうためである。

{literal}というSmartyの命令で囲んでしまえばこのエラーを回避することも可能だが、テンプレートファイルをデザイナーなどに直接編集してもらう場合、この対応も結構厄介である。

このため、テンプレートファイルは文字コード上、このような問題が発生しないEUC-JPを使う。

2.ページ出力時にEUC->SJIS変換する。

1で説明したとおり、テンプレートがEUC-JPなので出力時にSJISに変換する。以下のようになる。

$str = $this->fetch($tmpl);
echo  mb_convert_encoding($str, $encode, “EUC-JP”);

$tmplにテンプレートファイルを指定し、出力をSJISにするのであれば、$encode=”SJIS”、またRSSなどでは$encode=”UTF-8″とすれば良い。

3.入力文字コードの変換

CGIでは入力がSJISになっているのでプログラムの内部ではEUC-JPに変換が必要となる。以下のようになる。

function cleanRequest($request, $encode=”SJIS”)
{
    foreach($request as $key=>$val){
        if (is_array($val)){
            foreach($val as $k=>$v){
                $request[$key][$k] = stripslashes(trim($v));
                    if ($encode){
                        $request[$key][$k] = mb_convert_encoding($request[$key][$k], “EUC-JP”, $encode);
                    }
                }
            }
        }
        else{
            $request[$key] = stripslashes(trim($val));
                if ($encode){
                    $request[$key] = mb_convert_encoding($request[$key], “EUC-JP”, $encode);
                }
            }
        }
}

この関数をCGIの先頭部で

cleanRequest(&$_REQUEST);

などと呼び出して使う。

2,3ともクラスライブラリ化して利用すると便利である。

例えば、Smartyの派生クラスBrowserクラスなどを作り

<?
require_once(LIB_DIR.’Browser.php’);
{
    $tmpl = “index.tmpl”;
    $browser = new Browser(“SJIS”);
    $browser->cleanRequest(&$_REQUEST);
    $browser->printHeader();
    $browser->dispPage($tmpl);
}
?>

みたいに使う。

プログラムファイルはEUC-JPで作成し、assignする文字列はEUC-JPとする。DBを利用する場合、当然DB内部の文字コードはEUC-JPにした方が簡単である。