韌館-LearnHouse

Archive for 2 月 3rd, 2008

[PHP]linux下使用jpgraph顯示中文字型

這個問題讓我花了快一個禮拜的時間,本來一度想放棄使用jpgraph改用圖片的放式來顯示圖表

但今天早上一醒來,覺得想想,我花了那麼多時間蒐集資料與測試

竟然在這一刻要我從找另一個方法,真的很不甘心

因此我又從新試了一次,把可能會導致無法顯示中文或是中文亂碼的可能原因,重新的排列組合

一個一個去修改核心程式碼,最後終於讓我歸類出幾個需要改的項目

由於改很多,有些已經忘記是我改的還是原本的了,所以以下方法是我覺得可能影響的幾個要改的項目 

1.修改src/jpgraph.php

require_once('jpg-config.inc.php');
require_once('jpgraph_gradient.php');
require_once('jpgraph_errhandler.inc.php');
require_once('jpgraph_ttf.inc.php');

// Version info
DEFINE('JPG_VERSION','2.3');

// Minimum required PHP version
DEFINE('MIN_PHPVERSION','5.1.0');

// Should the image be a truecolor image?
DEFINE('USE_TRUECOLOR',true);

//------------------------------------------------------------------------
// Automatic settings of path for cache and font directory
// if they have not been previously specified
//------------------------------------------------------------------------
if(USE_CACHE) {
    if (!defined('CACHE_DIR')) {
    if ( strstr( PHP_OS, 'WIN') ) {
        if( empty($_SERVER['TEMP']) ) {
        $t = new ErrMsgText();
        $msg = $t->Get(11,$file,$lineno);
        die($msg);
        }
        else {
        DEFINE('CACHE_DIR', $_SERVER['TEMP'] . '/');
        }
    } else {
        DEFINE('CACHE_DIR','/tmp/jpgraph_cache/');
    }
    }
}
elseif( !defined('CACHE_DIR') ) {
    DEFINE('CACHE_DIR', '');
}

if (!defined('TTF_DIR')) {
    if (strstr( PHP_OS, 'WIN') ) {
    $sroot = getenv('SystemRoot');
        if( empty($sroot) ) {
        $t = new ErrMsgText();
        $msg = $t->Get(12,$file,$lineno);
        die($msg);
        }
    else {
      DEFINE('TTF_DIR', $sroot.'/fonts/');
        }
    } else {
//    DEFINE('TTF_DIR','/usr/X11R6/lib/X11/fonts/truetype/');//修改成下面的路徑
    DEFINE('TTF_DIR','/usr/share/fonts/zh_TW/TrueType/');
    }
}

Tips: 要注意/usr/share/fonts/zh_TW/TrueType/下是否有.ttf或.ttc的字型,若沒有可從Windows系統的fonts去複製

 

2.修改src/jpg-config.inc.php

DEFINE('CHINESE_TTF_FONT','bkai00mp.ttf');

修改成DEFINE('CHINESE_TTF_FONT','mingliu.ttc');

Tips: 紅色的部份可依自己的喜好的字型修改,而字型的檔案要在上述的路徑裡面,這裡以新細明體mingliu.ttc為例

 

3.修改src/jpgraph_ttf.inc.php

        FF_CHINESE     =>   array(FS_NORMAL    =>CHINESE_TTF_FONT,
                  FS_BOLD    =>'',
                  FS_ITALIC    =>'',
                  FS_BOLDITALIC    =>'' ),
修改成

         FF_CHINESE     =>   array(FS_NORMAL    =>'mingliu.ttc',
                  FS_BOLD    =>'mingliu.ttc',
                  FS_ITALIC    =>'mingliu.ttc',
                  FS_BOLDITALIC    =>'mingliu.ttc' ),

 

4.再來就是呈現繪圖資訊的檔案了,可從Example的資料夾選擇想要的範例修改

$graph->title->Set("這裡這樣設定就可以直接顯示中文");
$graph->title->SetFont(FF_BIG5, FS_NORMAL);

Tips1:不過若是從資料庫取得utf-8的字串,要先轉成big5的編碼格式

下面範例是從資料庫取得utf-8字串後丟入陣列,陣列再轉成big5編碼,我去掉一些在資料庫上做擷取資料判斷的簡略程式片斷

for($i = 0 ; $i <= 10 ; $i++)
{
    $name[$i] = iconv("utf-8","big5",$name[$i]);
}

Tips2:轉換的動作不能寫在呈現繪圖資訊的php檔案中,不然會導致圖表無法顯示

 

最後再來說一個我遇到的問題,就是如何把SetLegends($name3)也能顯示中文

其中$name是從資料庫取得的utf-8轉big5的中文陣列

而要能在SetLegends顯示,就要加入$graph->legend->SetFont(FF_BIG5, FS_NORMAL);

這麼一來就能顯示中文了 

 

 

2008年2 月 posted by admin in 程式&軟體 and have Comment (1)