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