01
|
std::string UrlEncode( const std::string& szToEncode)
|
02
|
{
|
03
|
std::string src = szToEncode;
|
04
|
char hex[] = "0123456789ABCDEF" ;
|
05
|
string dst;
|
06
|
07
|
for ( size_t i = 0; i < src.size(); ++i)
|
08
|
{
|
09
|
unsigned char cc = src[i];
|
10
|
if (isascii(cc))
|
11
|
{
|
12
|
if (cc == ' ' )
|
13
|
{
|
14
|
dst += "%20" ;
|
15
|
}
|
16
|
else
|
17
|
dst += cc;
|
18
|
}
|
19
|
else
|
20
|
{
|
21
|
unsigned char c = static_cast <unsigned char >(src[i]);
|
22
|
dst += '%' ;
|
23
|
dst += hex[c / 16];
|
24
|
dst += hex[c % 16];
|
25
|
}
|
26
|
}
|
27
|
return dst;
|
28
|
}
|
29
|
30
|
31
|
std::string UrlDecode( const std::string& szToDecode)
|
32
|
{
|
33
|
std::string result;
|
34
|
int hex = 0;
|
35
|
for ( size_t i = 0; i < szToDecode.length(); ++i)
|
36
|
{
|
37
|
switch (szToDecode[i])
|
38
|
{
|
39
|
case '+' :
|
40
|
result += ' ' ;
|
41
|
break ;
|
42
|
case '%' :
|
43
|
if ( isxdigit (szToDecode[i + 1]) && isxdigit (szToDecode[i + 2]))
|
44
|
{
|
45
|
std::string hexStr = szToDecode.substr(i + 1, 2);
|
46
|
hex = strtol (hexStr.c_str(), 0, 16);
|
47
|
//字母和数字[0-9a-zA-Z]、一些特殊符号[$-_.+!*'(),] 、以及某些保留字[$&+,/:;=?@]
|
48
|
//可以不经过编码直接用于URL
|
49
|
if (!((hex >= 48 && hex <= 57) || //0-9
|
50
|
(hex >=97 && hex <= 122) || //a-z
|
51
|
(hex >=65 && hex <= 90) || //A-Z
|
52
|
//一些特殊符号及保留字[$-_.+!*'(),] [$&+,/:;=?@]
|
53
|
hex == 0x21 || hex == 0x24 || hex == 0x26 || hex == 0x27 || hex == 0x28 || hex == 0x29
|
54
|
|| hex == 0x2a || hex == 0x2b|| hex == 0x2c || hex == 0x2d || hex == 0x2e || hex == 0x2f
|
55
|
|| hex == 0x3A || hex == 0x3B|| hex == 0x3D || hex == 0x3f || hex == 0x40 || hex == 0x5f
|
56
|
))
|
57
|
{
|
58
|
result += char (hex);
|
59
|
i += 2;
|
60
|
}
|
61
|
else result += '%' ;
|
62
|
} else {
|
63
|
result += '%' ;
|
64
|
}
|
65
|
break ;
|
66
|
default :
|
67
|
result += szToDecode[i];
|
68
|
break ;
|
69
|
}
|
70
|
}
|
71
|
return result;
|
72
|
}
|