LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2046|回复: 1

[原创]ANSI(GB2312)编码全中文支持的WEBALIZER版本,GD库 GB2312折衷支持。

[复制链接]
发表于 2007-8-7 16:30:27 | 显示全部楼层 |阅读模式
webalizer 日志分析程序,原版在编译时加上 -with-language=simplified_chinese, 可以实现中文文字部分的支持,但是图形部分由于GD库的缺陷,却是没有中文的,主要原因有2个:
1。系统默认的字库一般不包含中文字库;
2。GD不能正确识别gb2312的中文字符,需要把文字变成utf-8
网上原有一文《让Webalizer完美支持中文》提供了一个解决方案,就是把语言文件换成UTF8格式,再编译从而产生UFT8格式的网页,但是此方案有重大缺陷,就是webalizer 在做日志分析时,从日志文件中抓取的各种信息并不是UTF8的,操作系统对于系统日志文件的保存基本上全是ANSI编码格式。所以这样生成的日志网页编码是乱的:一部分是UTF8(标题部分),一部分是ANSI(GB2312)(中文数据部分)。
因为无法将系统日志文件修改成UTF8编码(这个改动量大了),所以最好的方式是,仍然在程序中采用ANSI(GB2312)编码,只有当WEBALIZER中调用GD图形库前临时做字符编码转换,把传入的GB2312编码的字符串转换成UTF8,再由GB库去生成中文图形文件。

找一个比较顺眼的中文字体,传到服务器上,比如/opt/lampp/webalizer/simkai.ttf,前提是服务器已经安装了gd包,并且顺利支持freetype,这个在安装gd的时候可以看到是不是支持.
因为控制图形输出的源文件中使用gdImageString()和gdImageStringUp()输出文字,这2个函数不支持自定义显示字体,所以这里要给他增加这个功能.我们做的就是重载这2个函数,用另一个支持自定义字体的函数gdImageStringFT()来代替他们的功能.打开源文件目录下的graphic.c文件:
在头部加入以下代码:
#include <iconv.h>
#define OUTLEN 255
在最后增加以下代码:
int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen)
//此函数用来转换字符编码
{
iconv_t cd;
int rc;
char **pin = &inbuf;
char **pout = &outbuf;
cd = iconv_open(to_charset,from_charset);
if (cd==0) return -1;
memset(outbuf,0,outlen);
if (iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1;
iconv_close(cd);
return 0;
}
void gdImageString(gdImagePtr im, gdFontPtr font, int x, int y, unsigned char *s, int color)
{
char out[OUTLEN];
code_convert("gb2312","utf-8",s,strlen(s),out,OUTLEN);
printf("unicode-->gb2312 in=%s|out=%s|\n",s,out);
gdImageStringFT(im, 0 , color, "/opt/lampp/webalizer/simkai.ttf", 9 , 0.0, x, y+9, out); //9是使用的字体大小,也可以自己修改
}
void gdImageStringUp(gdImagePtr im, gdFontPtr font, int x, int y, unsigned char *s, int color)
{
char out[OUTLEN];
code_convert("gb2312","utf-8",s,strlen(s),out,OUTLEN);
printf("unicode-->gb2312 in=%s|out=%s|\n",s,out);
gdImageStringFT(im, 0 , color, "/opt/lampp/webalizer/simkai.ttf", 9 , -PI/2, x, y-9 , out);
}
好了,开始配置.
./configure -with-language=simplified_chinese
make & make install

这样我们就得到了ANSI(GB2312)编码全中文支持的WEBALIZER版本

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2007-8-8 06:19:41 | 显示全部楼层
真是好东西,谢谢
不知现在用webalizer的多吗?????
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表