您的位置:首页 > 其它

URL Decode & Encode

2010-02-01 14:47 351 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: