Fixed bug where StrToWstr and WstrToStr may contain invalid characters from a previous call

This commit is contained in:
Kah Wei 2022-12-22 15:06:52 +08:00
parent 360b362b7b
commit 861e47812f
1 changed files with 23 additions and 21 deletions

View File

@ -26,27 +26,29 @@ namespace SHADE
std::vector<std::wstring> SHStringUtilities::Split(const std::wstring& str, const wchar_t& delim) std::vector<std::wstring> SHStringUtilities::Split(const std::wstring& str, const wchar_t& delim)
{ {
return Split<wchar_t>(str, delim); return Split<wchar_t>(str, delim);
} }
std::string SHStringUtilities::WstrToStr(const std::wstring& wstr) std::string SHStringUtilities::WstrToStr(const std::wstring& wstr)
{ {
static std::vector<char> buffer; static std::vector<char> buffer;
const int STR_SIZE = WideCharToMultiByte(CP_UTF8, 0, wstr.data(), static_cast<int>(wstr.size()), nullptr, 0, nullptr, nullptr) + 1 /* Null Terminator */; buffer.clear();
buffer.resize(STR_SIZE); const int STR_SIZE = WideCharToMultiByte(CP_UTF8, 0, wstr.data(), static_cast<int>(wstr.size()), nullptr, 0, nullptr, nullptr) + 1 /* Null Terminator */;
WideCharToMultiByte(CP_UTF8, 0, wstr.data(), static_cast<int>(wstr.size()), buffer.data(), MAX_PATH, nullptr, nullptr); buffer.resize(STR_SIZE, '\0');
return std::string(buffer.data()); WideCharToMultiByte(CP_UTF8, 0, wstr.data(), static_cast<int>(wstr.size()), buffer.data(), MAX_PATH, nullptr, nullptr);
} return std::string(buffer.data());
std::wstring SHStringUtilities::StrToWstr(const std::string& str) }
{ std::wstring SHStringUtilities::StrToWstr(const std::string& str)
static std::vector<wchar_t> buffer; {
const int WSTR_SIZE = MultiByteToWideChar(CP_UTF8, 0, str.data(), static_cast<int>(str.size()), nullptr, 0) + 1 /* Null Terminator */; static std::vector<wchar_t> buffer;
buffer.resize(WSTR_SIZE); buffer.clear();
MultiByteToWideChar(CP_UTF8, 0, str.data(), static_cast<int>(str.size()), buffer.data(), WSTR_SIZE); const int WSTR_SIZE = MultiByteToWideChar(CP_UTF8, 0, str.data(), static_cast<int>(str.size()), nullptr, 0) + 1 /* Null Terminator */;
return std::wstring(buffer.data()); buffer.resize(WSTR_SIZE, '\0');
} MultiByteToWideChar(CP_UTF8, 0, str.data(), static_cast<int>(str.size()), buffer.data(), WSTR_SIZE);
return std::wstring(buffer.data());
}
std::string SHStringUtilities::GetWin32ErrorMessage(unsigned long errorCode) std::string SHStringUtilities::GetWin32ErrorMessage(unsigned long errorCode)
{ {
return std::system_category().message(errorCode); return std::system_category().message(errorCode);
} }
} }