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