我编了一个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收到了数据,解码应该就没问题呀,你在仔细检查下,
解码原理就是这样.
呵呵,祝你顺利.