URL编码时数字和字母不变,一些特殊字符(.()!~-*)也保持不变,空格编码为’+’,其他的比如中文编码为%十六进制(hex)的形式,下面给出实现的代码,正确性也可以在网页在线编码,解码器验证
#include <iostream>
#include <sstream>
#include <cstring>
using namespace std;
unsigned char char_to_hex(unsigned char ch)
{
int result = ch / 16;
if (result >= 0 && result <= 9)
return 48 + result;
else
return 65 + result - 10;
}
unsigned char hex_to_char(unsigned char low,unsigned char high)
{
int h,l;
if (high >= '0' && high <= '9')
h = high - '0';
else
h = high - 65 + 10;
if (low >= '0' && low <= '9')
l = low - '0';
else
l = low - 65 + 10;
return h * 16 + l;
}
string UrlEncode(string url)
{
stringstream is;
for (size_t i = 0; i < url.size(); ++i)
{
if ((url[i] >= '0' && url[i] <= '9') || (url[i] >= 'a' && url[i]<= 'z') || (url[i] >= 'A' && url[i] <= 'Z') || strchr("-_.!~*'()",url[i]))
{
is << url[i];
}
else if (url[i] == ' ')
{
is << '+';
}
else
{
is << '%';
is << char_to_hex(url[i]);
is << char_to_hex(url[i] << 4);
}
}
return is.str();
}
string UrlDecode(string url)
{
stringstream is;
for (size_t i = 0; i < url.size(); ++i)
{
if (url[i] == '%')
{
is << hex_to_char(url[++i],url[++i]);
}
else if (url[i] == '+')
{
is << ' ';
}
else
{
is << url[i];
}
}
return is.str();
}
int main()
{
string s = "www.thegroly.xin/index/index.html?Name=刘阳&Number=2016 & Age=12";
cout << UrlEncode(s) << endl;
cout << UrlDecode(UrlEncode(s)) << endl;
}