17 enum class charset_id : uint16_t {
38 _Inout_ std::wstring& dst,
39 _In_reads_or_z_opt_(count_src)
const char* src, _In_
size_t count_src,
40 _In_ charset_id charset = charset_id::default)
42 assert(src || !count_src);
44 assert(count_src < INT_MAX || count_src == SIZE_MAX);
45 constexpr DWORD dwFlags = MB_PRECOMPOSED;
48 WCHAR szStackBuffer[1024/
sizeof(WCHAR)];
49#pragma warning(suppress: 6387)
50 int cch = MultiByteToWideChar(
static_cast<UINT
>(charset), dwFlags, src,
static_cast<int>(count_src), szStackBuffer, _countof(szStackBuffer));
53 dst.append(szStackBuffer, count_src != SIZE_MAX ? wcsnlen(szStackBuffer, cch) : (size_t)cch - 1);
54 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
56 cch = MultiByteToWideChar(
static_cast<UINT
>(charset), dwFlags, src,
static_cast<int>(count_src), NULL, 0);
57 std::unique_ptr<WCHAR[]> szBuffer(
new WCHAR[cch]);
58 cch = MultiByteToWideChar(
static_cast<UINT
>(charset), dwFlags, src,
static_cast<int>(count_src), szBuffer.get(), cch);
59 dst.append(szBuffer.get(), count_src != SIZE_MAX ? wcsnlen(szBuffer.get(), cch) : (size_t)cch - 1);
62 throw std::exception(
"not implemented");
66 inline _Deprecated_(
"Use stdex::strcat") void str2wstr(
67 _Inout_ std::wstring& dst,
68 _In_reads_or_z_opt_(count_src) const
char* src, _In_
size_t count_src,
69 _In_ charset_id charset = charset_id::default)
71 strcat(dst, src, count_src, charset);
84 _Inout_ std::wstring& dst,
85 _In_
const std::string& src,
86 _In_ charset_id charset = charset_id::default)
88 strcat(dst, src.data(), src.size(), charset);
91 inline _Deprecated_(
"Use stdex::strcat") void str2wstr(
92 _Inout_ std::wstring& dst,
93 _In_ const std::
string& src,
94 _In_ charset_id charset = charset_id::default)
96 strcat(dst, src, charset);
110 _Inout_ std::wstring& dst,
111 _In_reads_or_z_opt_(count_src)
const char* src, _In_
size_t count_src,
112 _In_ charset_id charset = charset_id::default)
115 strcat(dst, src, count_src, charset);
128 _Inout_ std::wstring& dst,
129 _In_
const std::string& src,
130 _In_ charset_id charset = charset_id::default)
132 strcpy(dst, src.data(), src.size(), charset);
143 inline std::wstring str2wstr(
144 _In_z_
const char* src,
145 _In_ charset_id charset = charset_id::default)
148 strcat(dst, src, SIZE_MAX, charset);
161 inline std::wstring str2wstr(
162 _In_reads_or_z_opt_(count_src)
const char* src, _In_
size_t count_src,
163 _In_ charset_id charset = charset_id::default)
166 strcat(dst, src, count_src, charset);
178 inline std::wstring str2wstr(
179 _In_
const std::string& src,
180 _In_ charset_id charset = charset_id::default)
182 return str2wstr(src.c_str(), src.size(), charset);
194 _Inout_ std::string& dst,
195 _In_reads_or_z_opt_(count_src)
const wchar_t* src, _In_
size_t count_src,
196 _In_ charset_id charset = charset_id::default)
198 assert(src || !count_src);
200 assert(count_src < INT_MAX || count_src == SIZE_MAX);
201 constexpr DWORD dwFlags = 0;
202 constexpr LPCCH lpDefaultChar = NULL;
205 CHAR szStackBuffer[1024/
sizeof(CHAR)];
206#pragma warning(suppress: 6387)
207 int cch = WideCharToMultiByte(
static_cast<UINT
>(charset), dwFlags, src,
static_cast<int>(count_src), szStackBuffer, _countof(szStackBuffer), lpDefaultChar, NULL);
210 dst.append(szStackBuffer, count_src != SIZE_MAX ? strnlen(szStackBuffer, cch) : (size_t)cch - 1);
211 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
213 cch = WideCharToMultiByte(
static_cast<UINT
>(charset), dwFlags, src,
static_cast<int>(count_src), NULL, 0, lpDefaultChar, NULL);
214 std::unique_ptr<CHAR[]> szBuffer(
new CHAR[cch]);
215 cch = WideCharToMultiByte(
static_cast<UINT
>(charset), dwFlags, src,
static_cast<int>(count_src), szBuffer.get(), cch, lpDefaultChar, NULL);
216 dst.append(szBuffer.get(), count_src != SIZE_MAX ? strnlen(szBuffer.get(), cch) : (size_t)cch - 1);
219 throw std::exception(
"not implemented");
223 inline _Deprecated_(
"Use stdex::strcat") void wstr2str(
224 _Inout_ std::
string& dst,
225 _In_reads_or_z_opt_(count_src) const
wchar_t* src, _In_
size_t count_src,
226 _In_ charset_id charset = charset_id::default)
228 strcat(dst, src, count_src, charset);
239 _Inout_ std::string& dst,
240 _In_
const std::wstring& src,
241 _In_ charset_id charset = charset_id::default)
243 strcat(dst, src.c_str(), src.size(), charset);
246 inline _Deprecated_(
"Use stdex::strcat") void wstr2str(
247 _Inout_ std::
string& dst,
248 _In_ const std::wstring& src,
249 _In_ charset_id charset = charset_id::default)
251 strcat(dst, src, charset);
263 _Inout_ std::string& dst,
264 _In_reads_or_z_opt_(count_src)
const wchar_t* src, _In_
size_t count_src,
265 _In_ charset_id charset = charset_id::default)
268 strcat(dst, src, count_src, charset);
279 _Inout_ std::string& dst,
280 _In_
const std::wstring& src,
281 _In_ charset_id charset = charset_id::default)
283 strcpy(dst, src.data(), src.size(), charset);
294 inline std::string wstr2str(
295 _In_z_
const wchar_t* src,
296 _In_ charset_id charset = charset_id::default)
299 strcat(dst, src, SIZE_MAX, charset);
312 inline std::string wstr2str(
313 _In_reads_or_z_opt_(count_src)
const wchar_t* src, _In_
size_t count_src,
314 _In_ charset_id charset = charset_id::default)
317 strcat(dst, src, count_src, charset);
329 inline std::string wstr2str(
330 _In_
const std::wstring& src,
331 _In_ charset_id charset = charset_id::default)
333 return wstr2str(src.c_str(), src.size(), charset);