Smarty3 ではデフォルトの文字コードは UTF-8 ですが、それ以外の文字コードを使用する方法を掲載しています。また、運の悪い人が出してしまうエラーを紹介します。Smarty3 で運の悪さがわかります。
スポンサーリンク
UTF-8 以外で作成されたテンプレートを使用するとアサインした内容が表示されないことがあります。それは Smarty3 のデフォルトの文字コードが UTF-8 だからです。次の Smarty クラスのコンストラクタを確認すると原因がわかります。
Smarty クラスのコンストラクタにて
// デフォルトで UTF-8 を内部エンコーディングとする
if (!defined('SMARTY_RESOURCE_CHAR_SET')) {
define('SMARTY_RESOURCE_CHAR_SET', 'UTF-8');
}
class Smarty extends Smarty_Internal_Data
{
/*
* 省略
*/
public function __construct()
{
// selfpointer need by some other class methods
$this->smarty = $this;
/*
* ここで、強制的に内部エンコーディングを設定している。
* php.ini の設定には興味なし。
*/
if (is_callable('mb_internal_encoding')) {
mb_internal_encoding(SMARTY_RESOURCE_CHAR_SET);
}
}
}
mb_internal_encoding 関数にて内部エンコーディングを UTF-8 にしています。例え php.ini の mbstring.internal_encoding を変更したとしても意味がありません。
よって、UTF-8 ではなく EUC-JP を使用するには Smarty クラスを require する前に、SMARTY_RESOURCE_CHAR_SET 定数を定義する必要があります。
define('SMARTY_RESOURCE_CHAR_SET', 'EUC-JP');
/**
* @see Smarty.class.php
*/
require_once 'Smarty.class.php';
// Smarty オブジェクト生成
$_smarty = new smarty();
運が良いのやら悪いのやら
define 関連でもう1つ運が悪い人が発生させるエラーという話があります。まずはコードとエラーの内容を見て下さい。
define('DS', 'xxx');
require_once 'Smarty.class.php';
/* 下記はエラー出力結果
Fatal error: Class 'Smarty_Internal_Data' not found in ・・・
Warning: include() [function.include]: Failed opening 'libsxxxsyspluginsxxxsmarty_internal_data.php' for inclusion (include_path='・・・') in Smarty.class.php on line 799
Warning: include(Smarty\libsxxxsyspluginsxxxsmarty_internal_data.php) [function.include]: failed to open stream: No such file or directory in Smarty.class.php on line 799
*/
Smarty で定義されている値は SMARTY_DIR のようにプレフックスが SMARTY_*** で開始しているのであまり重複することはないのですが、DS ( directory separator ) だけは以下のように定義されています。DS という名前で define の定義を行うと、要らぬ混乱を招きますのでやめたほうが無難です。
/**
* define shorthand directory separator constant
*/
if (!defined('DS')) {
define('DS', DIRECTORY_SEPARATOR);
}
ある意味運がいいかもしれませんが。。