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にした方が簡単である。