#pragma once #include "pch.h" struct StrUtils { static std::wstring UTF8ToUTF16(std::string_view str); static std::string UTF16ToUTF8(std::wstring_view str); static void Trim(std::string_view& str); static void Trim(std::string& str) { std::string_view sv(str); Trim(sv); str = sv; } static std::string Trim(const std::string& str) { std::string result = str; Trim(result); return result; } static std::vector Split(std::string_view str, char delimiter) { std::vector result; while (!str.empty()) { size_t pos = str.find(delimiter, 0); result.push_back(str.substr(0, pos)); if (pos == std::string_view::npos) { return result; } else { str.remove_prefix(pos + 1); } } return result; } static int isspace(char c) { return std::isspace(static_cast(c)); } static int isalpha(char c) { return std::isalpha(static_cast(c)); } static int isalnum(char c) { return std::isalnum(static_cast(c)); } static char toupper(char c) { return std::toupper(static_cast(c)); } static char tolower(char c) { return std::tolower(static_cast(c)); } static std::string ToUpperCase(std::string_view str) { std::string result(str); ToUpperCase(result); return result; } static void ToUpperCase(std::string& str) { std::transform(str.begin(), str.end(), str.begin(), toupper); } static std::string ToLowerCase(std::string_view str) { std::string result(str); ToLowerCase(result); return result; } static void ToLowerCase(std::string& str) { std::transform(str.begin(), str.end(), str.begin(), tolower); } template static constexpr size_t StrLen(const CHAR_T* str) { // std::char_traits 相比 std::strlen 支持更多字符类型 // 目前 MSVC 使用 __builtin_strlen,可以在编译时计算字符串常量的长度 return std::char_traits::length(str); } template static std::string Concat(std::string_view s1, std::string_view s2, const AV&... args){ return _Concat(s1, s2, static_cast(args)...); } template static std::wstring ConcatW(std::wstring_view s1, std::wstring_view s2, const AV&... args) { return _Concat(s1, s2, static_cast(args)...); } private: template static std::basic_string _Concat(std::basic_string_view s1, std::basic_string_view s2) { std::basic_string result; result.reserve(s1.size() + s2.size()); result.append(s1).append(s2); return result; } template static std::basic_string _Concat( std::basic_string_view s1, std::basic_string_view s2, std::basic_string_view s3 ) { std::basic_string result; result.reserve(s1.size() + s2.size() + s3.size()); result.append(s1).append(s2).append(s3); return result; } template static std::basic_string _Concat( std::basic_string_view s1, std::basic_string_view s2, std::basic_string_view s3, std::basic_string_view s4 ) { std::basic_string result; result.reserve(s1.size() + s2.size() + s3.size() + s4.size()); result.append(s1).append(s2).append(s3).append(s4); return result; } template static std::basic_string _Concat( std::basic_string_view s1, std::basic_string_view s2, std::basic_string_view s3, std::basic_string_view s4, std::basic_string_view s5 ) { std::basic_string result; result.reserve(s1.size() + s2.size() + s3.size() + s4.size() + s5.size()); result.append(s1).append(s2).append(s3).append(s4).append(s5); return result; } template static std::basic_string _Concat( std::basic_string_view s1, std::basic_string_view s2, std::basic_string_view s3, std::basic_string_view s4, std::basic_string_view s5, const AV&... args ) { return _Concat({ s1, s2, s3, s4, s5, static_cast&>(args)... }); } template static std::basic_string _Concat(std::initializer_list> args) { std::basic_string result; size_t size = 0; for (const std::basic_string_view& s : args) { size += s.size(); } result.reserve(size); for (const std::basic_string_view& s : args) { result.append(s); } return result; } };