1. 程式人生 > >php JpGraph使用和中文亂碼

php JpGraph使用和中文亂碼

使用


在使用JpGraph的時候我一般是把它的類庫放到了程式的根目錄下面
(解壓之後的src中的檔案,除了Examples資料夾之外)在用的時候只需要include就可以了

還可以將解壓之後的src中的檔案重新命名為jpgraph,將它放到d盤,再在php.ini檔案中新增到include_path中,

我的如下:
include_path = ".;c:/php/includes;d:/wamp/library;d:/jpgraph"

中文亂碼

JpGraph是一個PHP的圖形類庫,可以方便地生成各種柱狀圖,餅圖,折線圖等等,而且還可以方便地加文字

。但是,中文的情況就稍微麻煩了一點。在JpGraph中預設是要把字串轉成utf8的,但是如果你的檔案本身

就是utf8的,並且要用中文字型,它還會轉一遍,結果多轉了一次,就會出現亂碼。

除了編碼問題,還有就是字型問題。為了試驗中文顯示,專門拷了一個simsun.ttc過來是,在程式碼裡用

FF_SIMSUN就可以正確顯示中文,但是如果改用自己設定的FF_CHINESE,也就是uming.ttf,就又亂碼了,而

且和simsun.ttf亂碼時的不一樣。 後來發現FF_CHINESE和FF_BIG5是一樣,是繁體字型,所以和用FF_SIMSUN

的亂碼還不一樣。

解決以上問題的方法也就是傳遞正確的中文字串給JpGraph,所以可以把字串先轉成gb2312的,這樣

JpGraph就可以正確轉換了。當然,這個方法比較麻煩,每次都需要,
還可以直接修改jpgraph_ttf.inc.php。我的JpGraph為3.0.7版本,大概在178到186行之間的程式碼改為如下:
 elseif( $aFF === FF_SIMSUN ) {
            // Do Chinese conversion
            /*if( $this->g2312 == null ) {
                include_once 'jpgraph_gb2312.php' ;
                $this->g2312 = new GB2312toUTF8();
            }
            return $this->g2312->gb2utf8($aTxt);*/
            return $aTxt;
        }
但是我還是不喜歡改動原始碼,可以用iconv

("UTF-8","GB2312//IGNORE","簡體中文 繁體中文 test")函式
先將要顯示的字轉換為GB2312。
 
右上角的那些中文顯示有點難度,因為那個類沒有SetFont方法,也就是說那東西是不能顯示中文的。所以我

就改了基礎類庫
修改了jpgraph_legend.inc.php檔案裡的。
class Legend 類中有這樣一句
   private $font_family=FF_FONT1,$font_style=FS_NORMAL,$font_size=12;
我把他改為
private $font_family=FF_SIMSUN,$font_style=FS_NORMAL,$font_size=8;

就OK了。

下面是一個簡單列子:
<?php
include 'jpgraph/jpgraph.php';
include 'jpgraph/jpgraph_line.php';

$data = array(19 , 23 , 34 ,36, 50 , 60 , 65, 70 , 78); //模擬資料
$graph = new Graph($width = 400 , $height = 300); //建立新的Graph物件
$graph->SetScale("textlin"); //設定刻度模式
$graph->img->SetMargin(30 , 30 , 80 , 30) ; //設定圖表邊界

$graph->title->Set(iconv("UTF-8","GB2312//IGNORE","簡體中文 繁體中文 test")) ; //設定圖表標題
$graph->title->SetFont(FF_SIMSUN,FS_BOLD); // 設定中文字型
$graph->title->SetFont(FF_CHINESE,FS_BOLD);
$lineplot = new LinePlot($data); //建立新的LinePlot物件
$lineplot->SetLegend(iconv("UTF-8","GB2312//IGNORE","資料1"));//設定圖例文字
$graph->subtitle->SetFont(FF_SIMSUN);
$graph->subsubtitle->SetFont(FF_SIMSUN);
$lineplot->SetColor("red"); //設定曲線顏色
$graph->Add($lineplot); //在統計圖上繪製曲線

$data2 = array(20 ,30 ,45 , 23 , 45 , 69 , 60 , 79 , 80);
$lineplot = new LinePlot($data2); //建立新的LinePlot物件
$lineplot->SetLegend(iconv("UTF-8","GB2312//IGNORE","資料2"));//設定圖例文字
$lineplot->SetColor("blue"); //設定曲線顏色
$graph->Add($lineplot); //在統計圖上繪製曲線
$graph->Stroke() ; //輸出影象*/

遠行時沒有亂碼就行了,效果如下: