LinuxSir.Org  
| 网站首页 | 注册账号 | 论坛帮助 |

欢迎来到LinuxSir.Org!
您还未登录,请登录后查看论坛,或者点击论坛上方的注册链接注册新账号。


发表新主题 回复
 
主题工具
旧 07-08-07, 16:30 第 1 帖
dreamrise 帅哥
 
dreamrise 的头像
 
 
注册会员  
  注册日期: Nov 2002
  帖子: 396
  精华: 8
 

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


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版本
上传的附件
文件类型: rar WEBALIZER_GB_PATCH.rar (5.7 KB, 14 次查看)

此帖于 07-08-07 16:34 被 dreamrise 编辑.
  dreamrise 当前离线   回复时引用此帖
旧 07-08-08, 06:19 第 2 帖
权老实
 
 
 
注册会员  
  注册日期: Jul 2004
  帖子: 30
  精华: 0
 

真是好东西,谢谢
不知现在用webalizer的多吗?????
  权老实 当前离线   回复时引用此帖
发表新主题 回复


主题工具

发帖规则
您 [不可以] 发表新主题
您 [不可以] 回复主题
您 [不可以] 上传附件
您 [不可以] 编辑您的帖子

已 [启用] BB 代码
已 [启用] 表情符号
已 [启用] IMG 代码
已 [禁用] HTML 代码
[论坛跳转…]


所有时间均为[北京时间]。现在的时间是 19:26


Powered by vBulletin 版本 3.6.8
版权所有 ©2000 - 2009, Jelsoft Enterprises Ltd.
官方中文技术支持: vBulletin 中文
版权所有 ©2002 - 2009, LinuxSir.Org