Files
UNSWebServerCore_WindowsDLL/UOHash/URLCodec.cpp
T
2026-06-30 17:46:34 +08:00

48 lines
1.3 KiB
C++

#include "URLCodec.h"
#include <sstream>
#include <iomanip>
#include <cctype>
// 编码函数实现
// 参考 Python 的 urllib.parse.quote 实现
std::string urlcodec::url_encode(const std::string& input)
{
std::ostringstream oss;
for (const auto& ch : input)
{
// 保留字母、数字和部分符号
if (std::isalnum(static_cast<unsigned char>(ch)) || ch == '-' || ch == '_' || ch == '.' || ch == '~')
oss << ch;
else // 其他字符进行百分号编码
oss << '%' << std::uppercase << std::setw(2) << std::setfill('0') << std::hex << static_cast<int>(static_cast<unsigned char>(ch));
}
return oss.str();
}
// 解码函数实现
// 参考 Python 的 urllib.parse.unquote 实现
bool urlcodec::url_decode(const std::string& input, std::string& output)
{
std::ostringstream oss;
size_t length = input.length();
for (size_t i = 0; i < length; ++i)
{
if (input[i] == '%')
{
if (i + 2 >= length)
return false; // 错误:不完整的百分号编码
std::string hex_str = input.substr(i + 1, 2);
if (!std::isxdigit(hex_str[0]) || !std::isxdigit(hex_str[1]))
return false; // 错误:无效的十六进制字符
char decoded_char = static_cast<char>(std::stoi(hex_str, nullptr, 16));
oss << decoded_char;
i += 2; // 跳过已处理的两个字符
}
else
oss << input[i];
}
output = oss.str();
return true;
}