URL的编码与解码

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;
}

猜你喜欢

转载自blog.csdn.net/RGBMarco/article/details/81283481
今日推荐