JpGrap引入以及中文乱码问题

原创 2011年10月17日 17:08:44
在http://jpgraph.net/download/下载

Version: 3.5.0b1 (2010-10-07)

File Size Checksum (md5)
jpgraph-3.5.0b1.tar.gz 12.7MB 7237ef5dc19ad8bb67197a19782e950c


之后上传至/home/shaobing/文件夹下,该目录是我自己在服务器上的个人目录,

执行命令:

#tar -zxvf jpgraph-3.5.0b1.tar.gz

会生成一个文件夹jpgraph-3.5.0b1,将其中的src拷贝至你的网站目录下,我这里是/var/www/html/

命令为:#cp -R /home/shaobing/jpgraph-3.5.0b1/ /var/www/html/


PHP开发服务器上配置jpgraph类库的说明

  配置php.ini配置文件

  配置PHP的内存

  在绝大多数默认配置的PHP环境中,都没有足够的内存供jpgraph程序使用,由于其需要很多内存,所以在配置时最少需要32M内存。打开php.ini配置文件并定位到

1
memory_limit = xx

xx是具体的数字,将其修改为32MB,即

1
memory_limit = 32M

  jpgraph类库使用内存特别说明:当你需要创建非常大的图片时,这些内存可能是不够的,比如,假设你需要创建一个1200*1024大小的图片。意味着,就光其自身就需要1200*1024*4字节,即4.7MB RAM,当php jpgraph类库在内部处理时大约需要三倍的内存,也就是说最少需要15MB RAM。如果再需要内存加载PHP和整个jpgraph类库并动态执行和解析,那意味着另外需要至少15MB RAM。如果图片非常复杂,需要创建更多的对象(一个典型的例子是大甘特图)那么就需要双倍的内存即64MB RAM。(其实个人觉得这段是告诉你使用jpgraph类库时如何根据需要处理的图片大小计算出大致的内存)。

  配置PHP最大执行时间

  默认配置的PHP最大执行时间非常短。通常都在10秒左右。对于一般的互动或纯文本处理是足够的。但是处理大型复杂的图片需要更多时间。正因为这个理由,PHP最大执行时间最少需要增加到20秒。(根据你的图片复杂度和相关数据的处理,需要增加到30-40秒)

  与之相对应需要修改php.ini配置文件中的max_execution_time选项,即将

1
max_execution_time = xx

修改为

1
max_execution_time = 30

  禁止缓存输出

  打开php.ini配置文件,找到output_buffering选项,并将选项修改为

1
; output_buffering = xx

也就是注释掉缓存输出。

  禁止缓存输出的原因是在PHP开发期间,我们需要能够看到jpgraph类库潜在的错误信息,而开启缓存会阻止错误信息及时出现。要理解这些需要知道一些HTTP协议的基本原则。特别是MIME编码数据是如何工作的。

  下面简单描述下HTTP协议:

  1、当你在游览器中输入一个URI地址时,游览器主要通过GET或POST命令从服务器上请求数据。

  2、服务器回复一个数据流(或者数据不可用时会返回一个错误信息)。数据流中的前缀MIME信息告知游览器如何解析数据。最常用的类型是text/html。即告知游览器以嵌入HTML编码的纯文本方式解析数据。

  当数据要求被解析为图片时,数据流的前缀MIME信息是image/png或image/jpeg。当游览器受到MIME信息时就会以指示的图片编码格式解析下面的图像数据。

  这里需要特别注意的是每台服务器只能回复一个MIME类型。这是进一步理解生成动态图形的关键。这就解释了为什么运行PHP程序的服务器发送的头部信息首先显示其数据需要被解释为图片而不是同时发送图片和文字。

  现在来解释下为何输出缓冲会使得调试jpgraph类库会更加困难。

  通常PHP程序的所有输出都是有顺序的,比如首先必须发送头部信息然后再发送数据。如果没有头部信息输出或输出了没有头部信息的文本,游览器会解析为text/html格式。缓存的一个目的是允许数据存放一段时间,当决定发送什么类型的头部信息时,发送完头部信息后再将数据输出。

接下来从你的windows里找到simhei.ttf,simsun.ttc这两个文件,上传到//usr/share/fonts/truetype/下,truetype为我自己新建的文件夹

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,我用的是2.2版本的,大概在99到106行之间的:

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); 
   }
注释掉已有代码,直接返回$aTxt:

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

测试文件代码:

<?php
include('jpgraph-3.5.0b1/jpgraph/jpgraph.php');
include('jpgraph-3.5.0b1/jpgraph/jpgraph_pie.php');
$data=array(-21,-3,12,19,22,28,32,29,23,18,5,-10);
$graph=new pieGraph(500,300);
$graph->img->SetMargin(30,30,80,40);
$graph->title->Set("平均温度");
$pieplot=new piePlot($data);  //定义饼图
$pieplot->SetLegends(array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'));
$graph->legend->Pos(0.01,0.45,"left","center");
$graph->Add($pieplot);
//$graph->title->setfont(FF_SIMSUN);   //解决中文(标题)乱码问题
$graph->title->SetFont(FF_SIMSUN,FS_NORMAL,10);
$graph->Stroke();
?>
<?php  
    include ("jpgraph-3.5.0b1/jpgraph/jpgraph.php"); //必须要引用的文件  
    include ("jpgraph-3.5.0b1/jpgraph/jpgraph_line.php"); //包含曲线图文件  
      
    // y 轴数据,以数组形式赋值  
    $ydata = array(11,3,8,12,5,1,9,13,5,7);  
      
    // 创建 Graph 类,350 为宽度,250 长度,auto:表示生成的缓存文件名是该文件的文件名+扩展名(.jpg .png .gif ……)  
    $graph = new Graph(350,250,"auto");  
      
    // 设置刻度类型,x轴刻度可作为文本标注的直线刻度,y轴为直线刻度  
    $graph->SetScale("textlin");  
      
    // 创建坐标类,将y轴数据注入  
    $lineplot=new LinePlot($ydata);  
      
    // y 轴连线设定为蓝色  
    $lineplot->SetColor("blue");  
      
    // 坐标类注入图标类  
    $graph->Add($lineplot);  
      
    // 显示图  
    $graph->Stroke();
?>  


<?php
include('jpgraph-3.5.0b1/jpgraph/jpgraph.php'); //引入运行库
include('jpgraph-3.5.0b1/jpgraph/jpgraph_line.php');//引入运行库
$graph=new Graph(400,300);   //设置画布
$graph->setScale('textint');  //设置刻度样式
$graph->img->setMargin(30,30,80,80);  //设置画布边界
$graph->title->set("Year to air temperature");  //设置标题
$data=array(-21,-3,12,19,22,28,32,29,23,18,5,-10);  //定义数组类型数据
$lineplot=new LinePlot($data);//定义曲线图
$lineplot->SetColor("blue");  //定义曲线图颜色为红色
$lineplot->SetLegend("Temperature");//设置曲线图例
$graph->Add($lineplot);//将曲线图加入背景图像中
$graph->Stroke();  //将x-y坐标图输出

?>
<?php
include('jpgraph-3.5.0b1/jpgraph/jpgraph.php');
include('jpgraph-3.5.0b1/jpgraph/jpgraph_line.php');  //引入运行库
$data=array(-21,-3,12,19,22,28,32,29,23,18,5,-10);  //第一条数据
$data2y=array(3,12,17,20,25,32,41,38,30,27,15,10);
$graph=new Graph(400,300);
$graph->SetScale("textint",-30,50); //设置xy轴样式及y轴的最大值及最小值
$graph->SetY2Scale("int",-30,50); //设置右侧y轴样式及其最大值与最小值
$graph->setShadow();  //设置图像样式,加入阴影
$graph->img->setMargin(40,50,20,70);
$graph->title->set("changchun and changsha air tempetrature");
$lineplot=new LinePlot($data);
$lineplot2y=new LinePlot($data2y);  //定义第二条曲线
$graph->Add($lineplot);
$graph->Addy2($lineplot2y);
$graph->xaxis->title->Set("Month");
$graph->yaxis->title->set("changchun");
$graph->y2axis->title->set("changsha");
$lineplot->SetColor("red");
$lineplot2y->setcolor('blue');
$lineplot->setlegend("changchun");
$lineplot2y->setlegend("changsha");
$graph->legend->setlayout(LEGEND_HOR);
//$graph->legned->Pos(0.45,0.95,"center","bottom");  //Fatal error: Call to a member function Pos() on a non-object in
$graph->Stroke();
?>
<?php
include('jpgraph-3.5.0b1/jpgraph/jpgraph.php');
include('jpgraph-3.5.0b1/jpgraph/jpgraph_bar.php');
$data=array(-21,-3,12,19,22,28,32,29,23,18,5,-10);
$graph=new Graph(400,300);
$graph->setScale("textint");
$graph->setMargin(30,30,80,80);
$graph->title->set('air temperature');
$barplot=new BarPlot($data);
$barplot->SetLegend("changchun");
$barplot->value->show();
$barplot->setfillcolor("blue");
$barplot->setcolor("orange");
$graph->Add($barplot);
$graph->Stroke();
?>
<?php
include('jpgraph-3.5.0b1/jpgraph/jpgraph.php');
include('jpgraph-3.5.0b1/jpgraph/jpgraph_pie.php');
include('jpgraph-3.5.0b1/jpgraph/jpgraph_pie3d.php');
$data=array(-21,-3,12,19,22,28,32,29,23,18,5,-10);
$graph=new pieGraph(500,300);
$graph->img->SetMargin(30,30,80,40);
$graph->title->Set("平均温度");
$pie3dplot=new piePlot3d($data);  //定义饼图
$pie3dplot->SetLegends(array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'));
$graph->legend->Pos(0.01,0.45,"left","center");
$graph->Add($pie3dplot);
//$graph->title->setfont(FF_SIMSUN);   //解决中文(标题)乱码问题
$graph->Stroke();
?>



版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shaobingj126/article/details/6881891
收藏助手
不良信息举报
您举报文章:JpGrap引入以及中文乱码问题
举报原因:
原因补充:

(最多只允许输入30个字)