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 <pfeatherstone@pf>
---
 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<wchar_t> 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<size_t>(-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<size_t>(-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<std::size_t>(-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<std::size_t>(-1)) throw std::runtime_error("Conversion failed");
+        return out;
     }
 
 // ----------------------------------------------------------------------------------------
