VC实现URL编解码器

//变化UTF8为了中国
void UTF8ToGB(CString& szstr)
{
	WCHAR* strSrc;

	TCHAR* szRes;
	int i = MultiByteToWideChar(CP_UTF8, 0, szstr, -1, NULL, 0);
	strSrc = new WCHAR[i + 1];

	MultiByteToWideChar(CP_UTF8, 0, szstr, -1, strSrc, i);
	i = WideCharToMultiByte(CP_ACP, 0, strSrc, -1, NULL, 0, NULL, NULL);
	szRes = new TCHAR[i + 1];
	WideCharToMultiByte(CP_ACP, 0, strSrc, -1, szRes, i, NULL, NULL);
	szstr = szRes;
	delete[]strSrc;
	delete[]szRes;
}


//解析URL
//输入:"/apps/%E6%BB%B4%E6%BB%B4%E6%89%93%E8%BD%A6.apk"
//输出: "/apps/嘀嘀打车.apk"
//方法: 分下面两步实现
//先调用DecodeUrl(),得到"/apps/婊存淮鎵撹溅.apk"
//再调用UTF8ToGB(),得到"/apps/嘀嘀打车.apk"
BOOL DecodeUrl(char *pURL, char  *szBuff, int  nBuffLen)
{
	if (NULL == szBuff || NULL == pURL)
	{
		return FALSE;
	}
	if (nBuffLen == 0)
	{
		return FALSE;
	}

	char  *p = pURL;  // 用来循环  
	int    i = 0;    // i用来控制szBuff数组  

	/* 
	暂时保存szBuff编码的数据
	比如: %1A%2B%3C
	*/
	char  t = '';
	while (*p != '' && nBuffLen--)
	{
		if (*p == 0x25) // 0x25 = '%'  
		{
			//下面是十六进制数中常出现的大写字母,小写字母,数字的推断
			if (p[1] >= 'A' && p[1] <= 'Z')	//大写字母  
			{
				t = p[1] - 'A' + 10;  //A = 10,下同  
			}
			else if (p[1] >= 'a' && p[1] <= 'z') //小写字母  
			{
				t = p[1] - 'a' + 10;
			}
			else if (p[1] >= '0' && p[1] <= '9') //数字  
			{
				t = p[1] - '0';
			}
			t *= 16;  // 将数放到十位上去  

			if (p[2] >= 'A' && p[2] <= 'Z') //大写字母  
			{
				t += p[2] - 'A' + 10;
			}
			else if (p[2] >= 'a' && p[2] <= 'z') //小写字母  
			{
				t += p[2] - 'a' + 10;
			}
			else if (p[2] >= '0' && p[2] <= '9') //数字  
			{
				t += p[2] - '0';
			}

			//到此合成了一个十六进制数  
			szBuff[i] = t;

			p += 3, i++;
		}
		else
		{
			//没有被url编码的数据  
			//'+'特殊处理.它相当于一个空格  
			if (*p != '+')
			{
				szBuff[i] = *p;
			}
			else
			{
				szBuff[i] = 0x20;
			}
			i++;
			p++;
		}
	}

	szBuff[i] = '';  //终结者  
	return TRUE;
}


版权声明:本文博客原创文章。博客,未经同意,不得转载。

原文地址:https://www.cnblogs.com/hrhguanli/p/4747944.html