在 C++ 中对 URL 进行编码和解码可以使用标准库中的一些函数和手动处理字符串。URL 编码(也称为百分号编码)是将 URL 中的特殊字符转换为 %
后跟两个十六进制数字的形式。解码则是将这些编码还原为原始字符。
URL 编码的主要步骤是:
%
后跟两个十六进制数字。-
, _
, .
和 ~
)。URL 解码的主要步骤是:
%
后跟的两个十六进制数字转换为相应的字符。以下是一个简单的 C++ 示例,展示了如何进行 URL 编码和解码:
#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>
#include <cctype>
// URL 编码函数
std::string url_encode(const std::string &value) {
std::ostringstream escaped;
escaped.fill('0');
escaped << std::hex;
for (char c : value) {
// 保留字母、数字和某些特殊字符
if (isalnum(static_cast<unsigned char>(c)) || c == '-' || c == '_' || c == '.' || c == '~') {
escaped << c;
} else {
// 将其他字符转换为 % 后跟两个十六进制数字
escaped << '%' << std::setw(2) << int(static_cast<unsigned char>(c));
}
}
return escaped.str();
}
// URL 解码函数
std::string url_decode(const std::string &value) {
std::string result;
result.reserve(value.size());
for (size_t i = 0; i < value.size(); ++i) {
if (value[i] == '%' && i + 2 < value.size()) {
// 将 % 后跟的两个十六进制数字转换为字符
std::istringstream hex_stream(value.substr(i + 1, 2));
int hex_value;
if (hex_stream >> std::hex >> hex_value) {
result += static_cast<char>(hex_value);
i += 2;
} else {
result += '%';
}
} else if (value[i] == '+') {
// 将 + 转换为空格
result += ' ';
} else {
result += value[i];
}
}
return result;
}
int main() {
std::string original = "Hello, World! 你好,世界!";
std::string encoded = url_encode(original);
std::string decoded = url_decode(encoded);
std::cout << "Original: " << original << std::endl;
std::cout << "Encoded: " << encoded << std::endl;
std::cout << "Decoded: " << decoded << std::endl;
return 0;
}
url_encode
:std::ostringstream
来构建编码后的字符串。-
, _
, .
和 ~
),则直接添加到结果中。%
后跟两个十六进制数字。url_decode
:%
,则读取接下来的两个字符并将其解释为十六进制数,然后转换为相应的字符。+
,则转换为空格。main
:url_encode
和 url_decode
函数对字符串进行编码和解码。%
后面不是两个十六进制数字),解码函数可能会产生意外结果。领取专属 10元无门槛券
手把手带您无忧上云