`

URL Encode DeCode

阅读更多

#include "stdafx.h"
#include <string>

using namespace std;

unsigned int utf8_decode( char *s, unsigned int *pi )
{
	unsigned int c;
	int i = *pi;
	/* one digit utf-8 */
	if ((s[i] & 128)== 0 ) {
		c = (unsigned int) s[i];
		i += 1;
	} else if ((s[i] & 224)== 192 ) { /* 110xxxxx & 111xxxxx == 110xxxxx */
		c = (( (unsigned int) s[i] & 31 ) << 6) +
			( (unsigned int) s[i+1] & 63 );
		i += 2;
	} else if ((s[i] & 240)== 224 ) { /* 1110xxxx & 1111xxxx == 1110xxxx */
		c = ( ( (unsigned int) s[i] & 15 ) << 12 ) +
			( ( (unsigned int) s[i+1] & 63 ) << 6 ) +
			( (unsigned int) s[i+2] & 63 );
		i += 3;
	} else if ((s[i] & 248)== 240 ) { /* 11110xxx & 11111xxx == 11110xxx */
		c = ( ( (unsigned int) s[i] & 7 ) << 18 ) +
			( ( (unsigned int) s[i+1] & 63 ) << 12 ) +
			( ( (unsigned int) s[i+2] & 63 ) << 6 ) +
			( (unsigned int) s[i+3] & 63 );
		i+= 4;
	} else if ((s[i] & 252)== 248 ) { /* 111110xx & 111111xx == 111110xx */
		c = ( ( (unsigned int) s[i] & 3 ) << 24 ) +
			( ( (unsigned int) s[i+1] & 63 ) << 18 ) +
			( ( (unsigned int) s[i+2] & 63 ) << 12 ) +
			( ( (unsigned int) s[i+3] & 63 ) << 6 ) +
			( (unsigned int) s[i+4] & 63 );
		i += 5;
	} else if ((s[i] & 254)== 252 ) { /* 1111110x & 1111111x == 1111110x */
		c = ( ( (unsigned int) s[i] & 1 ) << 30 ) +
			( ( (unsigned int) s[i+1] & 63 ) << 24 ) +
			( ( (unsigned int) s[i+2] & 63 ) << 18 ) +
			( ( (unsigned int) s[i+3] & 63 ) << 12 ) +
			( ( (unsigned int) s[i+4] & 63 ) << 6 ) +
			( (unsigned int) s[i+5] & 63 );
		i += 6;
	} else {
		c = '?';
		i++;
	}
	*pi = i;
	return c;
}

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

	for (size_t i = 0; i < src.size(); i++)
	{
		unsigned char ch = src[i];
		if (isalnum(ch))
		{
			dst += ch;
		}
		else
			if (src[i] == ' ')
			{
				dst += '+';
			}
			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& src)
{
	std::string dst, dsturl;

	int srclen = src.size();

	for (size_t i = 0; i < srclen; i++)
	{
		if (src[i] == '%')
		{
			if(isxdigit(src[i + 1]) && isxdigit(src[i + 2]))
			{
				char c1 = src[++i];
				char c2 = src[++i];
				c1 = c1 - 48 - ((c1 >= 'A') ? 7 : 0) - ((c1 >= 'a') ? 32 : 0);
				c2 = c2 - 48 - ((c2 >= 'A') ? 7 : 0) - ((c2 >= 'a') ? 32 : 0);
				dst += (unsigned char)(c1 * 16 + c2);
			}
		}
		else
			if (src[i] == '+')
			{
				dst += ' ';
			}
			else
			{
				dst += src[i];
			}
	}

	int len = dst.size();

	for(unsigned int pos = 0; pos < len;)
	{
		unsigned int nvalue = utf8_decode((char *)dst.c_str(), &pos);
		dsturl += (unsigned char)nvalue;
	}

	return dsturl;
}

// 测试程序

int main(int argc, char* argv[])
{
	string str1 = "VC知识库 vckbase.com";
	string str2 = "www.vckbase.com/sql.asp?id=2%20update and sele%%ct%fc%80%80%80%80%af";

	printf("%s ", UrlEncode(str1).c_str());    // URL编码
	printf("%s ", UrlDecode(str2).c_str());    // URL解码

	return 0;
}
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics