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

代码分享

当前位置:
代码分享 » C/C++  » 常用工具方法
分享到: 
收藏 +0
1
C++语言的url encode 和decode
标签: <无>

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

1. [代码][C/C++/Objective-C]代码     跳至 [1] [全屏预览]

std::string UrlEncode(const std::string& szToEncode)
{
	std::string src = szToEncode;
	char hex[] = "0123456789ABCDEF";
	string dst;

	for (size_t i = 0; i < src.size(); ++i)
	{
		unsigned char cc = src[i];
		if (isascii(cc))
		{
			if (cc == ' ')
			{
				dst += "%20";
			}
			else
				dst += cc;
		}
		else
		{
			unsigned char c = static_cast<unsigned char>(src[i]);
			dst += '%';
			dst += hex[c / 16];
			dst += hex[c % 16];
		}
	}
	return dst;
}


std::string UrlDecode(const std::string& szToDecode)
{
	std::string result;
	int hex = 0;
	for (size_t i = 0; i < szToDecode.length(); ++i)
	{
		switch (szToDecode[i])
		{
		case '+':
			result += ' ';
			break;
		case '%':
			if (isxdigit(szToDecode[i + 1]) && isxdigit(szToDecode[i + 2]))
			{
				std::string hexStr = szToDecode.substr(i + 1, 2);
				hex = strtol(hexStr.c_str(), 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 += szToDecode[i];
			break;
		}
	}
	return result;
}


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

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

  • 1楼:edisondik 发表于 2013-01-17 18:08 回复此评论
    我测试了一下:
    gbk:
    update abc set title='我是标题',content='我是内容' where id=1

    我用php的urlencode转码后:
    update+abc+set+title%3D%27%CE%D2%CA%C7%B1%EA%CC%E2%27%2Ccontent%3D%27%CE%D2%CA%C7%C4%DA%C8%DD%27+where+id%3D1

    用你的
    UrlDecode解码后是:

    update abc set title%3D%27我是标题%27%2Ccontent%3D%27我是内容%27 where id%3D1


    有解决方法么?


  • 2楼:雅各宾 发表于 2015-10-29 11:01 回复此评论

    引用来自“edisondik”的评论

    我测试了一下:
    gbk:
    update abc set title='我是标题',content='我是内容' where id=1

    我用php的urlencode转码后:
    update+abc+set+title%3D%27%CE%D2%CA%C7%B1%EA%CC%E2%27%2Ccontent%3D%27%CE%D2%CA%C7%C4%DA%C8%DD%27+where+id%3D1

    用你的
    UrlDecode解码后是:

    update abc set title%3D%27我是标题%27%2Ccontent%3D%27我是内容%27 where id%3D1


    有解决方法么?


    告诉你方法:把你的GBK转成ANSI/multibyte之后再用瘘猪的方法 update%20abc%20set%20title='%CE%D2%CA%C7%B1%EA%CC%E2',content='%CE%D2%CA%C7%C4%DA%C8%DD'%20where%20id=1
开源从代码分享开始 分享代码
achellies的马甲的其它代码 全部(4)...