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); }
ある意味運がいいかもしれませんが。。