如果使用CGI 从前台获到的字符串有时需要进行编码转换,下面就是对中文字符的编码进行转换。详见代码:
%D6%D0%B9%FA:的中文编码为:中国
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char * chang(char *str)
{
char *tempstr = malloc(strlen(str) + 1);
//这儿没有使用初始化为 是因为下面 while 循环使用了它,如果初始化为则一次也不执行。
//如果改成 for 就可以初始化了。
memset(tempstr, '\0', strlen(str)+1);
int x = 0, y = 0;
char assii_1, assii_2;
int length = strlen(str);
//下面主要逻辑就是 每次循环要跳过 3个字符 即%和后面2个字符。这是一个整体,把这个结果赋值给字符数组。
//还有就是 "%B9%FA" %后第一个字符如果大于等于 A 则要减去 55 否则减去 48 第一个字符与第二个字符的区别就是
//结果第一个字符需要乘以 16 后面一个不需要,即把 16进制,转换成 10 进制。详见下面代码。
for (int y = 0; y < length;)
//while (tempstr[x])
{
if ((tempstr[x] = str[y]) == '%')
{
//y+1 y+2
if (str[y + 1] >= 'A')
{
assii_1 = str[y + 1] - 55;
}
else
{
assii_1 = str[y + 1] - 48;
}
if (str[y + 2] >= 'A')
{
assii_2 = str[y + 2] - 55;
}
else
{
assii_2 = str[y + 2] - 48;
}
tempstr[x] = assii_1 * 16 + assii_2;
y += 2;
}
x++;
y++;
}
tempstr[x] = '\0';
return tempstr;
}
void main()
{
//char strx[7] = "%B9%FA";
//char str[3] = { 0 };
////str[0]= 214;//'D' '6' 13*16+6
////str[1]=208;//'D' '0' 13*16+0
//str[0] = ('B' - 55) * 16 + '9' - 48;
//str[1] = ('F' - 55) * 16 + ('A'-55);
//printf("%s", str);
char str[100] = "%D6%D0%B9%FA";
//下面是代码测试。
//char temp[100] = { 0 };
//int k = 0;
//int asc1, asc2;
//for (int i = 0; i < strlen(str); i+=3)
//{
// if (str[i + 1]>='A')
// asc1 = (str[i + 1] - 55) * 16;
// else
// asc1 = str[i + 1] - 48;
// //注意i+1与i+2 在编码转换上的区别 如果是大于等于 'A'时 一个要乘以16,一个不用乘以16。
// if (str[i + 2] >= 'A')
// asc2 = (str[i + 2]-55);
// else
// asc2 = str[i + 2] - 48;
// temp[k++] = asc1 + asc2;
//}
//printf("%s\n", temp);
//把上面的代码封装到一个函数中。
char *p = chang(str);
printf("%s\n", p);
system("pause");
}