当前位置: 代码迷 >> CGI >> cgi的编码有关问题
  详细解决方案

cgi的编码有关问题

热度:717   发布时间:2012-02-02 23:57:14.0
cgi的编码问题!
我编了一个16进制转化为中文字符的程序,页面是utf-8编码的,不知道怎么的“中”字的16进制编码(%D6%D0%AD)能转换可其他的文字却转不过来,还请高手指教!
代码如下:
#include <stdio.h>
#include <string.h>

  int n;
  char num[];
  int k=0;

  void shortt(char s[]) //数组s[]里面存放键盘输入的16进制数,目的是
 { 
  int i;
  n=0;
  for(i=0;s[i]!='\0';i++)
  {
  if(s[i]>='0'&&s[i]<='9')
  {
  n=n*16+s[i]-'0';
  }
  if(s[i]>='a'&&s[i]<='f')
  {
  n=n*16+s[i]-'a'+10;
  }
  if(s[i]>='A'&&s[i]<='F')
  {
  n=n*16+s[i]-'A'+10;
  }
  }
 }
 
 
void read(char* string) //将%与字母拆分开,然后传入上面的shortt()转化为10进制数字
{
  int j=strlen(string)-1;
  int i;
  for(i=0;i<j;i++)
  {
  if(string[i]=='%')
  {
  char temp[2];
  temp[0]=string[i+1];
  temp[1]=string[i+2];
  shortt(temp);
  num[k]=n; //将第一个%后面的两个字母的十进制数存入数组
  k++;
  }
  }

}


main()
{
read("%E9%AB%98"); //这个16进制的“高”字就转化不过来,而(%D6%D0%AD)就可以正常显示“中”
k=0;
printf("%s",num);
}


------解决方案--------------------
C/C++ code

#include<stdio.h>
#include<string.h>


int hex_to_dec(char *ptr)
{
    int dec=0;
    dec=hex_posi(++ptr)*16;
    dec+=hex_posi(++ptr);
    return dec;
}

int hex_posi(char *ptr)
{
    char *list="0123456789ABCDEF";
    int posi=0;
    while(*ptr!=*list++){
        posi++;
    }
    return posi;
}

void decode(char c[]){
    char *tmp=c;
    char buf[1024];
    int posi=0,i=0;
    while(*tmp){
        if(tmp[posi]=='%')
        {
            buf[i]=hex_to_dec(tmp+posi);
            posi+=2;
        }
        else
        {
            buf[i]=tmp[posi];
        }
        i++;
        tmp++;
    }
    buf[i]=0;
    printf("%s\n",buf);
}

int main(){
    char c[]="%E9%AB%98";
    decode(c);
    return 0;
}

------解决方案--------------------
感觉和apache的关系不大呀
页面编码都统一,apache会自动将post数据编码
然后cgi收到了数据,解码应该就没问题呀,你在仔细检查下,
解码原理就是这样.
呵呵,祝你顺利.
  相关解决方案