(C++)UrlEncode的标准实现

原创
小哥 3年前 (2023-05-24) 阅读数 7 #大杂烩

关于UrlEncode的实现(C++)网上有许多不同的版本,要编码的字符集的选择并不统一。那么,有标准吗?答案是肯定的,请参阅 wiki

绝对不编码,只有字母、数字和破折号(-)、下划线(_)、点(.)和波浪号(~)其他角色取决于情况,所以一般urlencode只需保留上述字符而不进行编码。

下面是一个实现:

unsigned char ToHex(unsigned char x) 
{ 
    return  x > 9 ? x + 55 : x + 48; 
}

unsigned char FromHex(unsigned char x) 
{ 
    unsigned char y;
    if (x >= A && x <= Z) y = x - A + 10;
    else if (x >= a && x <= z) y = x - a + 10;
    else if (x >= 0 && x <= 9) y = x - 0;
    else assert(0);
    return y;
}

std::string UrlEncode(const std::string& str)
{
    std::string strTemp = "";
    size_t length = str.length();
    for (size_t i = 0; i < length; i++)
    {
        if (isalnum((unsigned char)str[i]) || 
            (str[i] == -) ||
            (str[i] == _) || 
            (str[i] == .) || 
            (str[i] == ~))
            strTemp += str[i];
        else if (str[i] ==  )
            strTemp += "+";
        else
        {
            strTemp += %;
            strTemp += ToHex((unsigned char)str[i] >> 4);
            strTemp += ToHex((unsigned char)str[i] % 16);
        }
    }
    return strTemp;
}

std::string UrlDecode(const std::string& str)
{
    std::string strTemp = "";
    size_t length = str.length();
    for (size_t i = 0; i < length; i++)
    {
        if (str[i] == +) strTemp +=  ;
        else if (str[i] == %)
        {
            assert(i + 2 < length);
            unsigned char high = FromHex((unsigned char)str[++i]);
            unsigned char low = FromHex((unsigned char)str[++i]);
            strTemp += high*16 + low;
        }
        else strTemp += str[i];
    }
    return strTemp;
}
版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除