Files
DNF_DEV/source/Tool/Tool_String.cpp
2025-10-06 04:18:49 +08:00

88 lines
2.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "Tool/Tool_String.h"
#include <SDL2/SDL.h>
#include <memory>
#include <stdexcept>
#include <vector>
#include <iconv.h>
#include <regex>
#include "Tool_String.h"
std::string Tool_toLowerCase(const std::string &str)
{
std::string result = str;
// 使用transform算法遍历字符串并转换为小写
std::transform(result.begin(), result.end(), result.begin(),
[](unsigned char c)
{ return std::tolower(c); });
return result;
}
// GBK 转 UTF-8基于 SDL2 的 SDL_iconv
std::string Tool_Gbk2Utf8(const std::string &gbk_str)
{
iconv_t cd = iconv_open("UTF-8", "GBK");
if (cd == (iconv_t)-1)
{
throw std::runtime_error("Failed to open iconv conversion descriptor");
}
size_t in_bytes_left = gbk_str.size();
char *in_buf = const_cast<char *>(gbk_str.data());
// 分配输出缓冲区GBK转UTF-8后长度最多可能增长到原长的3倍
size_t out_bytes_left = gbk_str.size() * 3 + 1;
std::string utf8_str(out_bytes_left, '\0');
char *out_buf = &utf8_str[0];
// 执行转换
size_t result = iconv(cd, &in_buf, &in_bytes_left, &out_buf, &out_bytes_left);
iconv_close(cd);
if (result == (size_t)-1)
{
throw std::runtime_error("Conversion failed!");
}
// 调整字符串大小以去除未使用的空间
utf8_str.resize(utf8_str.size() - out_bytes_left);
return utf8_str;
}
std::string Tool_RegRealPath(const std::string &Path)
{
// 检查路径中是否包含"../"
if (Path.find("../") == std::string::npos)
{
return Path;
}
// 正则表达式:匹配形如"xxx/../"的模式
// [^/]+ 匹配非斜杠的字符序列(表示目录名)
// /../ 匹配"/../"
std::regex pattern("[^/]+/\\.\\./");
std::string processedPath = Path;
std::smatch match;
// 循环处理所有匹配的模式
while (std::regex_search(processedPath, match, pattern))
{
// 替换匹配到的部分(删除"xxx/../"
processedPath = std::regex_replace(processedPath, pattern, "", std::regex_constants::format_first_only);
}
return processedPath;
}
std::string Tool_TruncatePath(const std::string &path)
{
// 查找最后一个 '/' 的位置
size_t lastSlashPos = path.find_last_of('/');
// 如果找到了 '/',返回从开始到该位置(包含)的子串
if (lastSlashPos != std::string::npos)
{
return path.substr(0, lastSlashPos + 1); // +1 是为了包含 '/' 本身
}
// 如果没有找到 '/',返回原字符串(或根据需求返回空)
return path;
}