[ Smarty3 ] UTF-8 以外の文字コードでテンプレートを作成する ( SMARTY_RESOURCE_CHAR_SET / DS )

Pocket

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);
}

ある意味運がいいかもしれませんが。。

スポンサーリンク

Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>