免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4173 | 回复: 3
打印 上一主题 下一主题

关于rrdtool-1.2.10和rrdtool-1.2.11中文支持的说明 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-09-22 17:51 |只看该作者 |倒序浏览
关于rrdtool-1.2.10和rrdtool-1.2.11中文支持的说明
作者:QuWenQing
日期:2005年9月22日 16:00

rrdtool不支持中文显示一直是大家比较郁闷的,一些编程高手对源代码进行重写实现其中文支持功能,由于近期需要使用rrdtool,所以对rrdtool进行了粗略的研究,通过对官方CHANGES日志研究发现,在rrdtool-1.2.10和rrdtool-1.2.11版本(目前最新版本为1.2.11)中,已经增加了对宽字符的支持,见如下源码(1.2.11版本):
文件名:src/rrd_gfx.c
    383 #ifdef HAVE_MBSTOWCS
    384   wchar_t       *cstr;    //宽字符处理
    385   size_t        clen = strlen(text)+1;
    386   cstr = malloc(sizeof(wchar_t) * clen); /* yes we are allocating probably too much here, I know */
    387   string->;count=mbstowcs(cstr,text,clen);
    388   if ( string->;count == -1){
    389   /* conversion did not work, so lets fall back to just use what we got */
    390         string->;count=clen-1;
    391         for(n=0;text[n] != '\0';n++){
    392             cstr[n]=(unsigned char)text[n];
    393         }
    394   }
    395 #else
    396   char          *cstr = strdup(text);
    397   string->;count = strlen (text);
    398 #endif
    399
    400   ft_pen.x = 0;   /* start at (0,0) !! */
    401   ft_pen.y = 0;
    402
    403
    404   string->;width = 0;
    405   string->;height = 0;
    406   string->;glyphs = (gfx_char) calloc (string->;count,sizeof(struct gfx_char_s));
    407   string->;num_glyphs = 0;
    408   string->;transform.xx = (FT_Fixed)( cos(M_PI*(rotation)/180.0)*0x10000);
    409   string->;transform.xy = (FT_Fixed)(-sin(M_PI*(rotation)/180.0)*0x10000);
    410   string->;transform.yx = (FT_Fixed)( sin(M_PI*(rotation)/180.0)*0x10000);
    411   string->;transform.yy = (FT_Fixed)( cos(M_PI*(rotation)/180.0)*0x10000);
    412
    413   use_kerning = FT_HAS_KERNING(face);
    414   previous    = 0;
    415   glyph = string->;glyphs;
    416   for (n=0; n<string->;count;glyph++,n++) {
    417     FT_Vector   vec;
    418     /* handle the tabs ...
    419        have a witespace glyph inserted, but set its width such that the distance
    420     of the new right edge is x times tabwidth from 0,0 where x is an integer. */
    421     unsigned int letter = cstr[n];
    422         letter = afm_fix_osx_charset(letter); /* unsafe macro */
    423   
    424     gottab = 0;
    425     if (letter == '\\' && n+1 < string->;count && cstr[n+1] == 't'){
    426             /* we have a tab here so skip the backslash and
    427                set t to ' ' so that we get a white space */
    428             gottab = 1;
    429             n++;
    430             letter  = ' ';
    431     }
    432     if (letter == '\t'){
    433         letter = ' ';
    434         gottab = 1 ;
    435     }
    436     /* initialize each struct gfx_char_s */
    437     glyph->;index = 0;
    438     glyph->;pos.x = 0;
    439     glyph->;pos.y = 0;
    440     glyph->;image = NULL;
    441     glyph->;index = FT_Get_Char_Index( face, letter );

但是根据源码直接编译安装,却发现无法正常显示中文,去Google了一圈,发现对老版本中文支持功能源码的修改,除了修改rrd_gfx.c文件,还修改了rrd_graph.c文件中的下列代码:
   2830 #ifdef HAVE_SETLOCALE
   2831     setlocale(LC_TIME,"";
   2832 #endif
将2831行的setlocale(LC_TIME,"";替换成setlocale(LC_ALL,"zh_CN.GB2312"(附补丁代码见后);同样对源代码进行同样操作,将修改后的源代码编译安装,就可以正常显示中文了。可以通过使用系统字体测试效果。
在create中增加--font参数--font TITLE:20:/usr/share/fonts/zh_CN/TrueType/gkai00mp.ttf(要确保/usr/share/fonts/zh_CN/TrueType/gkai00mp.ttf存在),生成的PNG图片就能正常显示中文。如果感觉系统提供的字体不好看,可以将Windows中的字体copy到linux下使用。例如使用Windows中的华文新魏(TrueType)字体(WINDOWS\Fonts\STXINWEI.TTF),将STXINWEI.TTF传到Linux下某个目录,就可以通过--font进行调用了。



例:


rrdtool graph dns.png \
--title "交换设备端口流量" \
--start `date -d "2005/09/22 00:00" +%s` \
--end `date -d "2005/09/22 12:00" +%s` \
DEF:in1=./55.rrd:traffic_in:AVERAGE \
DEFut1=./55.rrd:traffic_out:AVERAGE \
DEF:in2=./56.rrd:traffic_in:AVERAGE \
DEFut2=./56.rrd:traffic_out:AVERAGE \
CDEF:n_in2=in2,-1,* \
CDEF:n_out2=out2,-1,* \
AREA:in1#00694a:"端口1流入": \
LINE1ut1#0000ff:"端口1流出": \
AREA:n_in2#DA4725:"端口2流入": \
LINE1:n_out2#000000:"端口2流出": \
-w 600 -h 200 \
--font TITLE:16:./huawenxinwei.ttf \
--font AXIS:10:./huawenxinwei.ttf \
--font LEGEND:12:./huawenxinwei.ttf







附补丁(rrd_graph.c.1.2.11.patch)内容:
--- rrdtool/src/rrd_graph.c     2005-09-22 13:57:57.338739605 +0800
+++ patch/src/rrd_graph.c       2005-09-22 16:21:14.716989679 +0800
@@ -2828,7 +2828,8 @@
     tzset();
#endif
#ifdef HAVE_SETLOCALE
-    setlocale(LC_TIME,"";
+    // setlocale(LC_TIME,"";
+    setlocale(LC_ALL,"zh_CN.GB2312";
#endif
     im->;yorigin=0;
     im->;xorigin=0;
在rrdtool-1.2.11安装目录中运行patch -p1 < rrd_graph.c.1.2.11.patch进行补丁安装

port.jpg (18.57 KB, 下载次数: 45)

port.jpg

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2005-09-22 18:01 |只看该作者

关于rrdtool-1.2.10和rrdtool-1.2.11中文支持的说明

setlocale(LC_ALL,"zh_CN.GB2312";

只用 setlocale(LC_ALL,""; 會比定出語系應會來的有彈性
因為只要在 shell 下改變語系就好了,如此用 jp , kr , big5  等都可以顯示
至於 gfx.c 的部份要改動幾行,最後也是一個 patch 產出

至於你的圖和你的程序 是不一致的 , Outbound 1 不會變成中文
rrdtool 沒有翻譯的功能

另外,我不確定你的程序對隻位元的處理有沒有問題
你可以看看這裏我的解法
http://phorum.study-area.org/viewtopic.php?t=23822

论坛徽章:
0
3 [报告]
发表于 2005-09-23 10:13 |只看该作者

关于rrdtool-1.2.10和rrdtool-1.2.11中文支持的说明

呵呵,图应该是修改脚本后的,忘记更换新脚本了,已经对原贴进行了修改。
gfx.c的程序不需要修改,对setlocale(LC_ALL,""; 使用,要修改/etc/sysconfig/i18n中的LANG为LANG="zh_CN",改为"zh_CN.UTF-8"是不行的(偶的系统默认的只有zh_CN.UTF-8:zh_CN:zh:en_US.UTF-8:en_US:en这几种,有其他语言包安装的朋友,根据系统情况修改)

论坛徽章:
0
4 [报告]
发表于 2005-10-04 11:30 |只看该作者

关于rrdtool-1.2.10和rrdtool-1.2.11中文支持的说明

我现在是一个rrd一点都不会用的菜鸟...看了ABEL的教学也是迷茫.本人LINUX基础也不是很强..但是本着要学会的心态.请各位老鸟给我帮助
恳求各位的E-MAIL.
本人e-mail:zkdy@163.com
qq:557650
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP