CGI程序是构建WEB数据库应用的关键应用程序或者说网关程序。一般来讲CGI程序并不直接同IE浏览器打交道,而是由WEB服务器通过环境变量来接收或发送信息,CGI程序仅和WEB服务器的环境变量打交道。浏览器经常用POST方法将信息传递给环境变量。浏览器在碰到特殊字符时,如汉字,浏览器并不直接将特殊字符发送给WEB服务器,而是先将特殊字符的ASCII码转化成十六进制(如汉字“普通”的十六进制为:%C6%D5 %CD%A8),在发送出去。CGI程序在读取环境变量时,不但要对读取的字符串解析还要对特殊字符解码,目前市场上的CGI书籍大都针对PERL语言,但用C语言编写CGI的程序员,大都很难查到具体的解码过程,本人向大家提供一个完整的解码例子,他在VC++下编译通过,并能完好运行(直接编译并运行下面的例子,输入 “%C6%D5%CD%A8”,将输出“普通”两个字。总共包括两个文件:main.cpp, main.h
我们先看main.cpp :
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "main.h"
void main(void)
{
char line[80];
class decode_string unscape_str;
while(1)
{
printf("input your code string or exit
to close:/n");
gets(line);
if(!strcmp(line,"exit")) break;
printf("this decode string is:%s/n", unscape_str.translate_to_chinesse(line));
}
}
在看main.h:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
class decode_string{
private:
public:
char *translate_to_chinesse(char *);
};
char *decode_string::translate_to_chinesse
(char *dest_str)
{ register int x = 0, y = 0;
char *temp_str = NULL;
char ascii_one,ascii_two;
temp_str = (char *)malloc(strlen(dest_str) * sizeof(char) +1);
while(temp_str[x])
{
if((temp_str[x] = dest_str[y]) == '%')
{ if(dest_str[y+1] >= 'A')
ascii_one = ((dest_str[y+1] & 0xdf) - 'A') + 10;
else ascii_one = dest_str[y+1] - '0';
if(dest_str[y+2] >= 'A') ascii_two = ((dest_str[y+2] & 0xdf) - 'A') + 10;
else ascii_two = dest_str[y+2] -'0';
temp_str[x] = ascii_one * 16 + ascii_two; y += 2;
} x++;y++; } temp_str[x] = '/0';
return (temp_str);
}
在上面例子中,仅有的一个成员函数char *decode_string::translate_to_chinesse(char *dest_str)是一个完整的解码函数,喜欢用C语言的朋友可单独将它加到你的程序中;喜欢C++的朋友可根据自己的需要来增加这个类的功能。
我们先看main.cpp :
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "main.h"
void main(void)
{
char line[80];
class decode_string unscape_str;
while(1)
{
printf("input your code string or exit
to close:/n");
gets(line);
if(!strcmp(line,"exit")) break;
printf("this decode string is:%s/n", unscape_str.translate_to_chinesse(line));
}
}
在看main.h:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
class decode_string{
private:
public:
char *translate_to_chinesse(char *);
};
char *decode_string::translate_to_chinesse
(char *dest_str)
{ register int x = 0, y = 0;
char *temp_str = NULL;
char ascii_one,ascii_two;
temp_str = (char *)malloc(strlen(dest_str) * sizeof(char) +1);
while(temp_str[x])
{
if((temp_str[x] = dest_str[y]) == '%')
{ if(dest_str[y+1] >= 'A')
ascii_one = ((dest_str[y+1] & 0xdf) - 'A') + 10;
else ascii_one = dest_str[y+1] - '0';
if(dest_str[y+2] >= 'A') ascii_two = ((dest_str[y+2] & 0xdf) - 'A') + 10;
else ascii_two = dest_str[y+2] -'0';
temp_str[x] = ascii_one * 16 + ascii_two; y += 2;
} x++;y++; } temp_str[x] = '/0';
return (temp_str);
}
在上面例子中,仅有的一个成员函数char *decode_string::translate_to_chinesse(char *dest_str)是一个完整的解码函数,喜欢用C语言的朋友可单独将它加到你的程序中;喜欢C++的朋友可根据自己的需要来增加这个类的功能。