cacti lib/rrd.php rrdtoll 1343,Cacti中文故障总结

最近在对Cacti进行二次开发,但是发现中文上面有点问题,花了大半天时间才搞定,所以觉得有必要总结一下。

环境说明: RHEL 6 + Cacti 0.8.8a + rrdtool 1.3

接下来会写好几个步骤,但是问题根源其实就只有一个:未统一编码。建议没有特殊要求的话,统一使用UTF-8编码。

1. 操作系统层面

1) 得安装中文支持,否则怎么都搞不了。

2) 确认当前的语言编码,echo $LANG看下吧。一般我们在/etc/sysconfig/i18n这个文件中修改。

2. 应用层面

1) Apache配置文件里默认会加上"AddDefaultCharset UTF-8",如果你没有用UTF-8编码,那么这就会导致问题;

2) MySQL服务器默认编码是latin1,这是没办法正确存储中文的,所以我们一般把它改成utf8.[mysql]

default-character-set=utf8

[mysqld]

default-character-set=utf8

character-set-server=utf8

Cacti自带的sql文件没有指定编码,所以导入数据库之后是什么编码取决于你myql客户端程序采用什么编码。

如果之前没注意到这个问题,可以用mysqldump导出之后,把latin1改成utf8再导入即可。

3) 如果上面的配置都搞定之后,rrdtool就不会是问题了。

当然还有一种不常见的情况,那就是假如那就是你的系统默认编码必须使用GB18030,但是你想要UTF-8,倒是可以用网上流传的一种方法:mv /usr/bin/rrdtool /usr/bin/rrdtool.local

touch /usr/bin/rrdtool

#!/bin/bash

export LANG=zh_CN.UTF-8

/usr/bin/rrdtool.local "$@"

chmod +x /usr/bin/rrdtool

3. Cacti自身的问题

1) Cacti未使用utf8编码来操作MySQL数据库

修改lib/database.php,增加一行:$cnn_id->Execute("set names 'utf8'");while ($i <= $retries) {

$cnn_id = ADONewConnection($dsn);

$cnn_id->Execute("set names 'utf8'");

if ($cnn_id) {

return($cnn_id);

}

$i++;

usleep(40000);

}

2) rrdtool没有正确获取中文

在lib/rrd.php中有一行:"--title=" . cacti_escapeshellarg($graph["title_cache"]) . RRD_NL .

cacti_escapeshellarg函数在unix下直接调用PHP的escapeshellarg函数,但是该函数默认的LC_CTYPE是C,这种情况下非ASCII字符就会被破坏。

所以我们要显式声明下LC_CTYPE这个环境变量:在文件lib/functions.php的最前面,添加一句代码:

setlocale(LC_CTYPE, "zh_CN.UTF-8");

3) 关于中文字体

其实上面讲过,只要系统有了中文支持,就会有中文字体。但是默认的字体不好看,我们可以优化下。

"RRDTool Default Font"这个选项我设置的是"文泉驿正黑 Bold",用的是pango命名语法,系统支持哪些字体可以用"fc-list"命令来查看,新增字体后用"fc-cache -fv"命令来刷新。

4) Cacti默认使用UTF-8编码,在新版的里面,HTML头里面也默认声明了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值