关闭

编码转换

80人阅读 评论(0) 收藏 举报
分类:

如果使用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");
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:50030次
    • 积分:992
    • 等级:
    • 排名:千里之外
    • 原创:24篇
    • 转载:176篇
    • 译文:0篇
    • 评论:5条
    最新评论