zoukankan      html  css  js  c++  java
  • 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;
    }


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

  • 相关阅读:
    【其他】UTF-8带签名与不带签名
    【Python】Python 过滤列表
    【EF】EF扩展库(批量操作)
    【python】用 sqlacodegen 将存在的数据库表 转化成model.py
    【python】使用枚举类
    【python】Python: Enum枚举的实现
    【python】python sqlalchemy core
    【python】python字符串前面加u,r,b的含义
    【EF】Entity Framework Core 2.0 特性介绍和使用指南
    Asp.Net 之 前台绑定常用总结
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4747944.html
Copyright © 2011-2022 走看看