您好,匿名用户
随意问技术百科期待您的加入

解决了nagios中文乱码问题,那么nagios跟escape_html_tags有何关系?

+2 投票

为什么escape_html_tags=1这个参数,导致了nagios管理界面的中文乱码问题?

谁能解释下?

用户头像 提问 2012年 12月23日 @ Janna 下士 (667 威望)
编辑 2012年 12月23日 @Janna
分享到:

1个回答

+2 投票
 
最佳答案

1 首先找到中文乱码页面的相关cgi,以status.cgi为例,在对应的cgi/status.c里面找到展示services的部分(nagios3.3.1源码)

1780	/* the rest of the columns... */
1781	printf("<TD CLASS='status%s'>%s</TD>\n", status_class, status);
1782	printf("<TD CLASS='status%s' nowrap>%s</TD>\n", status_bg_class, date_time);
1783	printf("<TD CLASS='status%s' nowrap>%s</TD>\n", status_bg_class, state_duration);
1784	printf("<TD CLASS='status%s'>%d/%d</TD>\n", status_bg_class, temp_status->current_attempt, temp_status->max_attempts);
1785	printf("<TD CLASS='status%s' valign='center'>", status_bg_class);
1786	printf("%s&nbsp;", (temp_status->plugin_output == NULL) ? "" : html_encode(temp_status->plugin_output, TRUE));

1780 行是在打印 Status 的数据;
1781 行是在打印 Last Check 的数据;
1782行是在打印 Duration 的数据;
1783 行是在打印 Attempt 的数据;
1785~1786 行是在打印 Status Information 的数据;

我们需要注意的是1786行:为什么我们的插件输出被 html_encode 了?这个函数究竟做了什么?

2 在 include/cgiutils.h 中找到 html_encode 函数

451   char * html_encode(char *, int);	 /* encodes a string in HTML format (for what the user sees) */

3 在cgi/cgiutils.c 中找到 html_encode 的实现

950  /* escapes a string used in HTML */
951  char * html_encode(char *input, int escape_newlines) {
952  	int len, output_len;
953  	int x, y;
954  	char temp_expansion[10];

		...
				
1015  	/* for simplicity, all other chars represented by their numeric value */
1016  	else {
1017  	        if(escape_html_tags == FALSE)
1018  			encoded_html_string[y++] = input[x];
1019  		else {
1020  			encoded_html_string[y] = '\x0';
1021  			sprintf(temp_expansion, "&#%d;", (unsigned char)input[x]);
1022  			if((int)strlen(encoded_html_string) < (output_len - strlen(temp_expansion))) {
1023  				strcat(encoded_html_string, temp_expansion);
1024  				y += strlen(temp_expansion);
1025  				}
1026  			}
1027 		 }

		 ...
							
1032  	return encoded_html_string;
	}

看1015行注释,for simplicity, all other chars represented by their numeric value。简单地,除去之前已处理的其他字符(包括中文)转化为数字。这里是中文乱码的关键。

4 这样解决方法有以下几种

  • 修改配置文件etc/cgi.cfg中参数escape_html_tags的值1→0,禁止其他字符转为数字。
  • 修改源代码中html_encode函数,对中文进行处理。
用户头像 回复 2012年 12月23日 @ Wukong 上等兵 (475 威望)
提一个问题:

相关问题

+7 投票
3 回复 1,019 阅读
+1 投票
1 回复 99 阅读
0 投票
1 回复 39 阅读
用户头像 提问 2013年 10月25日 @ Athena 上等兵 (346 威望)
+1 投票
1 回复 44 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...