這個問題讓我花了快一個禮拜的時間,本來一度想放棄使用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);
這麼一來就能顯示中文了