当前访客身份:游客 [ 登录 | 加入 OSCHINA ]

代码分享

当前位置:
代码分享 » C/C++  » 常用工具方法
RyanLee

C++ URL 编码/解码

RyanLee 发布于 2010年11月05日 14时, 2评/7460阅
分享到: 
收藏 +0
1

代码片段(2) [全屏查看所有代码]

1. [代码]cpp代码     跳至 [1] [2] [全屏预览]

//URL 编码
std::string urlencode(std::string encode)
{
   std::string result;
   for(unsigned int i = 0; i< static_cast<unsigned int>(encode.length()); i++)
   {
    char ch = encode[i];
    if(ch == ' ')
    {
     result += '+';
    }else if(ch >= 'A' && ch <= 'Z'){
     result += ch;
    }else if(ch >= 'a' && ch <= 'z'){
     result += ch;
    }else if(ch >= '0' && ch <= '9'){
     result += ch;
    }else if(ch == '-' || ch == '-' || ch == '.' || ch == '!' || ch == '~' || ch == '*' || ch == '\'' || ch == '(' || ch == ')' ){
     result += ch;
    }else{
     result += '%';
     result += iChoo::iconv::char_to_hex(ch);
    }
   }
return result;
}
//URL 解码
std::string urldecode(std::string decode)
{
   std::string result;
   for(unsigned int i = 0; i< static_cast<unsigned int>(decode.length()); i++)
   {
    switch(decode[i])
    {
    case '+':
     result += ' ';
    break;
    case '%':
     if(isxdigit(decode[i + 1]) && isxdigit(decode[i + 2]))
     {
      result += iChoo::iconv::hex_to_char(decode[i+1], decode[i+2]);
      i += 2;
     }else {
      result += '%';
     }
    break;
    default:
     result += decode[i];
    break;
    }
   }
return result;
}

2. [代码]将encodeed的url中那些可以不用编码的字符decode     跳至 [1] [2] [全屏预览]

/************************************************************************/
/*函数名:urlDecode
/*功   能:将encodeed的url中那些可以不用编码的字符decode
/*返回值:返回decode之后的url
/************************************************************************/
string Utility::urlDecode(string url)
{
	string result = "", hexStr = "";
	int hex = 0;
	for(size_t i = 0; i< url.length(); i++)
	{
		switch(url[i])
		{
		case '+':
			result += ' ';
			break;
		case '%':
			if(isxdigit(url[i + 1]) && isxdigit(url[i + 2]))
			{
				hexStr = url.substr(i+1,2);
				hex = stoi(hexStr,0,16);
				//字母和数字[0-9a-zA-Z]、一些特殊符号[$-_.+!*'(),] 、以及某些保留字[$&+,/:;=?@]
				//可以不经过编码直接用于URL
				if((hex>=48&&hex<=57)||		//0-9
					(hex>=97&&hex<=122)||	//a-z
					(hex>=65&&hex<=90)||	//A-Z
					//一些特殊符号及保留字[$-_.+!*'(),]  [$&+,/:;=?@]
					hex==0x21||hex==0x24||hex==0x26||hex==0x27||hex==0x28||hex==0x29					
					||hex==0x2a||hex==0x2b||hex==0x2c||hex==0x2d||hex==0x2e||hex==0x2f
					||hex==0x3A||hex==0x3B||hex==0x3D||hex==0x3f||hex==0x40||hex==0x5f
					)
				{
					result += char(hex);
					i += 2;
				}
				else result += '%';
			}else {
				result += '%';
			}
			break;
		default:
			result += url[i];
			break;
		}
	}
	return result;
}


开源中国-程序员在线工具:Git代码托管 API文档大全(120+) JS在线编辑演示 二维码 更多»

发表评论 回到顶部 网友评论(2)

  • 1楼:RyanLee 发表于 2010-11-07 15:33 回复此评论
    iChoo::iconv::hex_to_char貌似是Linux里的函数,我自己换了一个方法
  • 2楼:kailelv 发表于 2011-12-22 23:39 回复此评论
    iChoo::iconv::hex_to_char 这个是哪里的啊
开源从代码分享开始 分享代码
RyanLee的其它代码 全部(9)...