From 773daadf363c4f42b029b1ccc7d670d71296799f Mon Sep 17 00:00:00 2001 From: pfeatherstone Date: Thu, 21 Aug 2025 22:09:44 +0100 Subject: [PATCH 1/4] surpress warnings in convert_mbstring_to_wstring() --- dlib/unicode/unicode.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/dlib/unicode/unicode.cpp b/dlib/unicode/unicode.cpp index 89b96910be..1f48fd59c2 100644 --- a/dlib/unicode/unicode.cpp +++ b/dlib/unicode/unicode.cpp @@ -96,9 +96,18 @@ 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.data(), &p, out.size(), &st); + if (n == static_cast(-1)) throw std::runtime_error("Conversion failed"); + return out; } // ---------------------------------------------------------------------------------------- From 2d68d52c22639baadef380e69be2657f221e8509 Mon Sep 17 00:00:00 2001 From: pfeatherstone Date: Thu, 21 Aug 2025 22:12:47 +0100 Subject: [PATCH 2/4] fix --- dlib/unicode/unicode.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlib/unicode/unicode.cpp b/dlib/unicode/unicode.cpp index 1f48fd59c2..6cb1f6b967 100644 --- a/dlib/unicode/unicode.cpp +++ b/dlib/unicode/unicode.cpp @@ -105,7 +105,7 @@ namespace dlib // Convert std::wstring out(n, L'\0'); st = std::mbstate_t{}; - n = std::mbsrtowcs(out.data(), &p, out.size(), &st); + n = std::mbsrtowcs(&out[0], &p, out.size(), &st); if (n == static_cast(-1)) throw std::runtime_error("Conversion failed"); return out; } From 0d67a333280e27a8fa20739681ec3d8e1dab67a4 Mon Sep 17 00:00:00 2001 From: pfeatherstone Date: Thu, 21 Aug 2025 22:22:28 +0100 Subject: [PATCH 3/4] fixed convert_wstring_to_mbstring as well --- dlib/unicode/unicode.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/dlib/unicode/unicode.cpp b/dlib/unicode/unicode.cpp index 6cb1f6b967..dd0688ddef 100644 --- a/dlib/unicode/unicode.cpp +++ b/dlib/unicode/unicode.cpp @@ -114,11 +114,19 @@ namespace dlib 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.data(), &p, out.size(), &st); + if (n == static_cast(-1)) throw std::runtime_error("Conversion failed"); + return out; } // ---------------------------------------------------------------------------------------- From 7d1692932471470b5bb8b0d6542cce56cf42770b Mon Sep 17 00:00:00 2001 From: pfeatherstone <45853521+pfeatherstone@users.noreply.github.com> Date: Thu, 21 Aug 2025 22:49:52 +0100 Subject: [PATCH 4/4] Oops --- dlib/unicode/unicode.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlib/unicode/unicode.cpp b/dlib/unicode/unicode.cpp index dd0688ddef..5791f66fe9 100644 --- a/dlib/unicode/unicode.cpp +++ b/dlib/unicode/unicode.cpp @@ -124,7 +124,7 @@ namespace dlib // Convert std::string out(n, '\0'); st = std::mbstate_t{}; - n = std::wcsrtombs(out.data(), &p, out.size(), &st); + n = std::wcsrtombs(&out[0], &p, out.size(), &st); if (n == static_cast(-1)) throw std::runtime_error("Conversion failed"); return out; }