呵呵,好久没有写技术文章了。今天开始恢复吧。

从星期开始这一个月我的任务是修改 dotProject 以适应公司的应用,哈哈,可以正大光明的玩偶最喜欢的 PHP 了,开心啊。

第一个任务就是修改里面项目甘特图中中文乱码的问题。

原始的效果如下:

其中的乱码应该是“测试任务”

明显的 PHP 的 GD 库对中文支持的 bug,呵呵。上网搜索解决方法,在一个台湾网站上找到解决方法,根据和中文版的对应,修改方法如下:

  1. 找到 Linux 下存放字体的路径,我的系统是 /usr/X11R6/lib/X11/fonts/,然后找到 c:\window\fonts\,拷贝 sinsum.ttc 到这个目录下并且改名为 simsun.ttf。

  2. 修改 dotProject/lib/jpgraph/src/jpgraph.php

    L 27,把原来的 DEFINE("TTF_DIR","/usr/X11R6/lib/X11/fonts/truetype/");修改为 DEFINE("TTF_DIR","/usr/X11R6/lib/X11/fonts/");

    L176,在 DEFINE("FF_TREBUCHE",17); 后面增加一行 DEFINE("FF_SIMSUN", 18);

    L1786,

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function TTF() {
        $this->style_names=array(FS_NORMAL=>'normal', FS_BOLD=>'bold', FS_ITALIC=>'italic', FS_BOLDITALIC=>'bolditalic');
        // File names for available fonts
        $this->font_files=array(
            FF_COURIER => array(FS_NORMAL=>'cour', FS_BOLD=>'courbd', FS_ITALIC=>'couri', FS_BOLDITALIC=>'courbi' ),
            FF_GEORGIA => array(FS_NORMAL=>'georgia', FS_BOLD=>'georgiab', FS_ITALIC=>'georgiai', FS_BOLDITALIC=>'' ),
            FF_TREBUCHE => array(FS_NORMAL=>'trebuc', FS_BOLD=>'trebucbd', FS_ITALIC=>'trebucit', FS_BOLDITALIC=>'trebucbi' ),
            FF_VERDANA => array(FS_NORMAL=>'verdana', FS_BOLD=>'verdanab', FS_ITALIC=>'verdanai', FS_BOLDITALIC=>'' ),
            FF_TIMES => array(FS_NORMAL=>'times', FS_BOLD=>'timesbd', FS_ITALIC=>'timesi', FS_BOLDITALIC=>'timesbi' ),
            FF_COMIC => array(FS_NORMAL=>'comic', FS_BOLD=>'comicbd', FS_ITALIC=>'', FS_BOLDITALIC=>'' ),
            FF_ARIAL => array(FS_NORMAL=>'arial', FS_BOLD=>'arialbd', FS_ITALIC=>'ariali', FS_BOLDITALIC=>'arialbi' )
        );
    }

    修改为

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function TTF() {
        $this->style_names=array(FS_NORMAL=>'normal', FS_BOLD=>'bold', FS_ITALIC=>'italic', FS_BOLDITALIC=>'bolditalic');
        // File names for available fonts
        $this->font_files=array(
            FF_COURIER => array(FS_NORMAL=>'cour', FS_BOLD=>'courbd', FS_ITALIC=>'couri', FS_BOLDITALIC=>'courbi' ),
            FF_GEORGIA => array(FS_NORMAL=>'georgia', FS_BOLD=>'georgiab', FS_ITALIC=>'georgiai', FS_BOLDITALIC=>'' ),
            FF_TREBUCHE =>array(FS_NORMAL=>'trebuc', FS_BOLD=>'trebucbd', FS_ITALIC=>'trebucit', FS_BOLDITALIC=>'trebucbi' ),
            FF_VERDANA => array(FS_NORMAL=>'verdana', FS_BOLD=>'verdanab', FS_ITALIC=>'verdanai', FS_BOLDITALIC=>'' ),
            FF_TIMES => array(FS_NORMAL=>'times', FS_BOLD=>'timesbd', FS_ITALIC=>'timesi', FS_BOLDITALIC=>'timesbi' ),
            FF_COMIC => array(FS_NORMAL=>'comic', FS_BOLD=>'comicbd', FS_ITALIC=>'', FS_BOLDITALIC=>'' ),
            FF_ARIAL => array(FS_NORMAL=>'arial', FS_BOLD=>'arialbd', FS_ITALIC=>'ariali', FS_BOLDITALIC=>'arialbi' ),
            FF_SIMSUN => array(FS_NORMAL=>'simsun', FS_BOLD=>'simsun', FS_ITALIC=>'simsun', FS_BOLDITALIC=>'simsun' )
        );
    }
  3. 修改 dotProject/lib/jpgraph/src/jpgraph_gantt.php

    L413,把 var $iFFamily=FF_FONT1,$iFStyle=FS_NORMAL,$iFSize=10; 修改为 var $iFFamily=FF_SIMSUN,$iFStyle=FS_NORMAL,$iFSize=10;

    L429,把 $this->iText = $aTxt; 修改为 $this->iText = iconv("GB2312","UTF-8",$aTxt);

  4. 修改 dotProject/modules/tasks/gantt.php

    L201,把 $name = strlen( utf8_decode($a["task_name"]) ) > 25 ? substr( utf8_decode($a["task_name"]), 0, 22 ).'...' : utf8_decode($a["task_name"]) ; 修改为 $name = strlen( $a["task_name"] ) > 25 ? substr( $a["task_name"], 0, 22 ).'...' : $a["task_name"] ;

完成,刷新页面,结果如下:

一切OK。

开始看了那些大陆的帖子,都是讲在 Windows 下怎么处理的,只要把 FF_FONT 相关改成 FF_SIMSUN 就行了,那些台湾的帖子,只说到第 3 步就说 OK 了,后来想想,估计他们用的都是 big5 编码的关系。我们都是 GB2312。

然后再一个俄文站点上找到第4步的修改方法,成功~

哈哈