uft-8 及 gb2312对 数据编码时,保留 字符和数字的anscii 编码方式,但对汉字及特殊字符进程 百分号编码。其中utf-8中一个 汉字 占3个字节,gb2312 中占2个字节。
例如 "三" 进行utf-8 百分号编码,生成%E4%B8%89
在解码时,需加%后的2位16进制数转换为整数,放入响应数组位置即可。
代码示例:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int unencode(char *src, char *dest)
{
int code;
for(; *src != '\0'; src++, dest++)
{
if(*src == '%')
{
if(sscanf(src+1, "%2x", &code) != 1)
code = '?';
*dest = code;
src += 2;
}
else if(*src == '+')
*dest = ' ';
else
*dest = *src;
}
*dest = '\0';
return 0;
}
char *src = "%E4%B8%89%E5%9B%BD%E6%BC%94%E4%B9%89";
char *dest;
char *res = "三国演义";
int main()
{
int len = strlen(src);
dest = (char *)malloc(len*sizeof(char) + 1);
unencode(src, dest);
printf("dest:%s\n", dest);
printf("res len:%d, %s\n", strlen(res), res);
if(0 == strcmp(dest, res))
printf("equal\n");
else
printf("not equal\n");
free(dest); //释放动态分配内存
return 0;
}
运行结果:
dest:三国演义
res len:12, 三国演义
equal