@@ -96,20 +96,37 @@ namespace dlib
96
96
97
97
const std::wstring convert_mbstring_to_wstring (const std::string &src)
98
98
{
99
- std::vector<wchar_t > wstr (src.length ()+5 );
100
- std::mbstowcs (&wstr[0 ], src.c_str (), src.length ()+1 );
101
- return std::wstring (&wstr[0 ]);
99
+ // Compute dst length
100
+ std::mbstate_t st{};
101
+ const char * p = src.c_str ();
102
+ size_t n = std::mbsrtowcs (nullptr , &p, 0 , &st);
103
+ if (n == static_cast <size_t >(-1 )) throw std::runtime_error (" Invalid multibyte sequence / wrong locale" );
104
+
105
+ // Convert
106
+ std::wstring out (n, L' \0 ' );
107
+ st = std::mbstate_t {};
108
+ n = std::mbsrtowcs (&out[0 ], &p, out.size (), &st);
109
+ if (n == static_cast <size_t >(-1 )) throw std::runtime_error (" Conversion failed" );
110
+ return out;
102
111
}
103
112
104
113
// ----------------------------------------------------------------------------------------
105
114
106
115
const std::string convert_wstring_to_mbstring (const std::wstring &src)
107
116
{
108
- using namespace std ;
109
- std::string str;
110
- str.resize ((src.length () + 1 ) * MB_CUR_MAX);
111
- wcstombs (&str[0 ], src.c_str (), str.size ());
112
- return std::string (&str[0 ]);
117
+ std::mbstate_t st{};
118
+ const wchar_t * p = src.c_str ();
119
+
120
+ // Compute length
121
+ size_t n = std::wcsrtombs (nullptr , &p, 0 , &st);
122
+ if (n == static_cast <std::size_t >(-1 )) throw std::runtime_error (" Invalid wide sequence / locale mismatch" );
123
+
124
+ // Convert
125
+ std::string out (n, ' \0 ' );
126
+ st = std::mbstate_t {};
127
+ n = std::wcsrtombs (&out[0 ], &p, out.size (), &st);
128
+ if (n == static_cast <std::size_t >(-1 )) throw std::runtime_error (" Conversion failed" );
129
+ return out;
113
130
}
114
131
115
132
// ----------------------------------------------------------------------------------------
0 commit comments