C++类URL编码和解码使用技巧


在C++中,处理URL编码和解码通常不直接内置于标准库中,但你可以通过一些现有的库来简化这个过程,比如使用Boost库中的`boost::url_encode`和`boost::url_decode`(尽管这些函数不是Boost库直接提供的,但可以通过Boost.Asio或其他方式实现,或者自己编写函数)。不过,为了保持简洁和高效,我将展示如何手动实现基本的URL编码和解码函数。

### URL编码

URL编码主要是将非ASCII字符和一些特殊字符(如空格、`#`、`%`等)转换为`%`后跟两位十六进制数的形式。


#include <iostream>
#include <string>
#include <cctype>

std::string urlEncode(const std::string& input) {
    std::string output;
    for (char c : input) {
        if (isalnum(c) || c == '-' || c == '_' || c == '.' || c == '~') {
            output += c;
        } else {
            char buffer[4];
            sprintf(buffer, "%%%02X", static_cast<unsigned char>(c));
            output += buffer;
        }
    }
    return output;
}

// 使用示例
int main() {
    std::string input = "Hello World! 你好,世界!";
    std::string encoded = urlEncode(input);
    std::cout << "Encoded: " << encoded << std::endl;
    return 0;
}

### URL解码

URL解码则是将`%`后跟两位十六进制数转换回对应的字符。


#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>

std::string urlDecode(const std::string& input) {
    std::string output;
    std::istringstream iss(input);
    std::string hex_str;
    char c;

    while (iss.get(c)) {
        if (c == '%') {
            hex_str.clear();
            iss >> std::hex >> std::setw(2) >> std::setfill('0') >> hex_str;
            if (hex_str.length() == 2) {
                char decoded_char = static_cast<char>(std::stoi(hex_str, nullptr, 16));
                output += decoded_char;
            }
        } else {
            output += c;
        }
    }

    return output;
}

// 使用示例
int main() {
    std::string encoded = "Hello%20World%21%20%E4%BD%A0%E5%A5%BD%EF%BC%8C%E4%B8%96%E7%95%8C%EF%BC%81";
    std::string decoded = urlDecode(encoded);
    std::cout << "Decoded: " << decoded << std::endl;
    return 0;
}

请注意,这些示例代码主要关注于基本功能,并未处理所有可能的边界情况(如`%`后面不是有效的两位十六进制数)。在实际应用中,你可能需要添加额外的错误检查和处理逻辑。