From ffe78814638d100cbd12e116990afb1903b82b5e Mon Sep 17 00:00:00 2001 From: pfeatherstone <45853521+pfeatherstone@users.noreply.github.com> Date: Fri, 22 Aug 2025 01:47:16 +0100 Subject: [PATCH] [unicode] fixed warning in convert_mbstring_to_wstring() (#3110) * surpress warnings in convert_mbstring_to_wstring() * fix * fixed convert_wstring_to_mbstring as well * Oops --------- Co-authored-by: pfeatherstone --- dlib/unicode/unicode.cpp | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/dlib/unicode/unicode.cpp b/dlib/unicode/unicode.cpp index 89b96910be..5791f66fe9 100644 --- a/dlib/unicode/unicode.cpp +++ b/dlib/unicode/unicode.cpp @@ -96,20 +96,37 @@ namespace dlib const std::wstring convert_mbstring_to_wstring(const std::string &src) { - std::vector wstr(src.length()+5); - std::mbstowcs(&wstr[0], src.c_str(), src.length()+1); - return std::wstring(&wstr[0]); + // Compute dst length + std::mbstate_t st{}; + const char* p = src.c_str(); + size_t n = std::mbsrtowcs(nullptr, &p, 0, &st); + if (n == static_cast(-1)) throw std::runtime_error("Invalid multibyte sequence / wrong locale"); + + // Convert + std::wstring out(n, L'\0'); + st = std::mbstate_t{}; + n = std::mbsrtowcs(&out[0], &p, out.size(), &st); + if (n == static_cast(-1)) throw std::runtime_error("Conversion failed"); + return out; } // ---------------------------------------------------------------------------------------- const std::string convert_wstring_to_mbstring(const std::wstring &src) { - using namespace std; - std::string str; - str.resize((src.length() + 1) * MB_CUR_MAX); - wcstombs(&str[0], src.c_str(), str.size()); - return std::string(&str[0]); + std::mbstate_t st{}; + const wchar_t* p = src.c_str(); + + // Compute length + size_t n = std::wcsrtombs(nullptr, &p, 0, &st); + if (n == static_cast(-1)) throw std::runtime_error("Invalid wide sequence / locale mismatch"); + + // Convert + std::string out(n, '\0'); + st = std::mbstate_t{}; + n = std::wcsrtombs(&out[0], &p, out.size(), &st); + if (n == static_cast(-1)) throw std::runtime_error("Conversion failed"); + return out; } // ----------------------------------------------------------------------------------------