22#pragma GCC diagnostic push
23#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
24#pragma GCC diagnostic ignored "-Wexit-time-destructors"
29 enum class charset_id : uint16_t {
55 constexpr charset_id wchar_t_charset = charset_id::utf16;
57 constexpr charset_id system_charset = charset_id::utf16;
59 constexpr charset_id system_charset = charset_id::system;
62 constexpr charset_id wchar_t_charset = charset_id::utf32;
63 constexpr charset_id system_charset = charset_id::system;
73 inline charset_id charset_from_name(_In_z_
const char* name)
76 bool operator()(_In_z_
const char* a, _In_z_
const char* b)
const
78 return stricmp(a, b) < 0;
81 static const std::map<const char*, charset_id, charset_less> charsets = {
82 {
"UNICODE-1-1-UTF-7", charset_id::utf7 },
83 {
"UTF-7", charset_id::utf7 },
84 {
"CSUNICODE11UTF7", charset_id::utf7 },
86 {
"UTF-8", charset_id::utf8 },
87 {
"UTF8", charset_id::utf8 },
89 {
"UTF-16", charset_id::utf16 },
90#if BYTE_ORDER == BIG_ENDIAN
91 {
"UTF-16BE", charset_id::utf16 },
93 {
"UTF-16LE", charset_id::utf16 },
96 {
"UTF-32", charset_id::utf32 },
97#if BYTE_ORDER == BIG_ENDIAN
98 {
"UTF-32BE", charset_id::utf32 },
100 {
"UTF-32LE", charset_id::utf32 },
103 {
"CP1250", charset_id::windows1250 },
104 {
"MS-EE", charset_id::windows1250 },
105 {
"WINDOWS-1250", charset_id::windows1250 },
107 {
"CP1251", charset_id::windows1251 },
108 {
"MS-CYRL", charset_id::windows1251 },
109 {
"WINDOWS-1251", charset_id::windows1251 },
111 {
"CP1252", charset_id::windows1252 },
112 {
"MS-ANSI", charset_id::windows1252 },
113 {
"WINDOWS-1252", charset_id::windows1252 },
115 if (
auto el = charsets.find(name); el != charsets.end())
117 return charset_id::system;
127 template <
class TR = std::
char_traits<
char>,
class AX = std::allocator<
char>>
128 charset_id charset_from_name(_In_
const std::basic_string<char, TR, AX>& name)
130 return charset_from_name(name.c_str());
136 template <
typename T_from,
typename T_to>
140 charset_id m_from, m_to;
148 m_from_wincp = to_encoding(from);
149 m_to_wincp = to_encoding(to);
151 m_handle = iconv_open(to_encoding(to), to_encoding(from));
152 if (m_handle == (iconv_t)-1)
153 throw std::system_error(errno, std::system_category(),
"iconv_open failed");
160 iconv_close(m_handle);
164 charset_id from_encoding()
const {
return m_from; }
165 charset_id to_encoding()
const {
return m_to; }
174 template <
class TR_to = std::
char_traits<T_to>,
class AX_to = std::allocator<T_to>>
176 _Inout_ std::basic_string<T_to, TR_to, AX_to>& dst,
177 _In_reads_or_z_opt_(count_src)
const T_from* src, _In_
size_t count_src)
179 _Assume_(src || !count_src);
180 count_src = strnlen<T_from>(src, count_src);
181 if (!count_src) _Unlikely_
185 constexpr DWORD dwFlagsWCMB = 0;
186 constexpr LPCCH lpDefaultChar = NULL;
189 if (m_from_wincp == m_to_wincp) _Unlikely_{
190 dst.append(
reinterpret_cast<const T_to*
>(src), count_src);
194#pragma warning(suppress: 4127)
195 if constexpr (
sizeof(T_from) ==
sizeof(
char) &&
sizeof(T_to) ==
sizeof(
wchar_t)) {
196 _Assume_(count_src < INT_MAX || count_src == SIZE_MAX);
199 DWORD dwFlagsMBWC =
static_cast<UINT
>(m_from_wincp) < CP_UTF7 ? MB_PRECOMPOSED : 0;
200 WCHAR szStackBuffer[1024 /
sizeof(WCHAR)];
201#pragma warning(suppress: 6387)
202 int cch = MultiByteToWideChar(
static_cast<UINT
>(m_from_wincp), dwFlagsMBWC,
reinterpret_cast<LPCCH
>(src),
static_cast<int>(count_src), szStackBuffer, _countof(szStackBuffer));
205 dst.append(
reinterpret_cast<const T_to*
>(szStackBuffer), count_src != SIZE_MAX ? wcsnlen(szStackBuffer, cch) :
static_cast<size_t>(cch) - 1);
208 DWORD dwResult = GetLastError();
209 if (dwResult == ERROR_INSUFFICIENT_BUFFER) {
211 cch = MultiByteToWideChar(
static_cast<UINT
>(m_from_wincp), dwFlagsMBWC,
reinterpret_cast<LPCCH
>(src),
static_cast<int>(count_src), NULL, 0);
212 size_t offset = dst.size();
213 dst.resize(offset +
static_cast<size_t>(cch));
214 cch = MultiByteToWideChar(
static_cast<UINT
>(m_from_wincp), dwFlagsMBWC,
reinterpret_cast<LPCCH
>(src),
static_cast<int>(count_src), &dst[offset], cch);
215 dst.resize(offset + (count_src != SIZE_MAX ? wcsnlen(&dst[offset], cch) :
static_cast<size_t>(cch) - 1));
218 throw std::system_error(dwResult, std::system_category(),
"MultiByteToWideChar failed");
221#pragma warning(suppress: 4127)
222 if constexpr (
sizeof(T_from) ==
sizeof(
wchar_t) &&
sizeof(T_to) ==
sizeof(
char)) {
223 _Assume_(count_src < INT_MAX || count_src == SIZE_MAX);
226 CHAR szStackBuffer[1024 /
sizeof(CHAR)];
227#pragma warning(suppress: 6387)
228 int cch = WideCharToMultiByte(
static_cast<UINT
>(m_to_wincp), dwFlagsWCMB,
reinterpret_cast<LPCWCH
>(src),
static_cast<int>(count_src), szStackBuffer, _countof(szStackBuffer), lpDefaultChar, NULL);
231 dst.append(
reinterpret_cast<const T_to*
>(szStackBuffer), count_src != SIZE_MAX ? strnlen(szStackBuffer, cch) :
static_cast<size_t>(cch) - 1);
234 DWORD dwResult = GetLastError();
235 if (dwResult == ERROR_INSUFFICIENT_BUFFER) {
237 cch = WideCharToMultiByte(
static_cast<UINT
>(m_to_wincp), dwFlagsWCMB,
reinterpret_cast<LPCWCH
>(src),
static_cast<int>(count_src), NULL, 0, lpDefaultChar, NULL);
238 size_t offset = dst.size();
239 dst.resize(offset +
static_cast<size_t>(cch));
240 cch = WideCharToMultiByte(
static_cast<UINT
>(m_to_wincp), dwFlagsWCMB,
reinterpret_cast<LPCWCH
>(src),
static_cast<int>(count_src), &dst[offset], cch, lpDefaultChar, NULL);
241 dst.resize(offset + (count_src != SIZE_MAX ? strnlen(&dst[offset], cch) :
static_cast<size_t>(cch) - 1));
244 throw std::system_error(dwResult, std::system_category(),
"WideCharToMultiByte failed");
247#pragma warning(suppress: 4127)
248 if constexpr (
sizeof(T_from) ==
sizeof(
char) &&
sizeof(T_to) ==
sizeof(
char)) {
249 _Assume_(count_src < INT_MAX || count_src == SIZE_MAX);
252 DWORD dwFlagsMBWC =
static_cast<UINT
>(m_from_wincp) < CP_UTF7 ? MB_PRECOMPOSED : 0, dwResult;
253 WCHAR szStackBufferMBWC[512 /
sizeof(WCHAR)];
254#pragma warning(suppress: 6387)
255 int cch = MultiByteToWideChar(
static_cast<UINT
>(m_from_wincp), dwFlagsMBWC,
reinterpret_cast<LPCCH
>(src),
static_cast<int>(count_src), szStackBufferMBWC, _countof(szStackBufferMBWC));
258 size_t count_inter = count_src != SIZE_MAX ? wcsnlen(szStackBufferMBWC, cch) :
static_cast<size_t>(cch) - 1;
259 _Assume_(count_inter < INT_MAX);
262 CHAR szStackBufferWCMB[512 /
sizeof(CHAR)];
263#pragma warning(suppress: 6387)
264 cch = WideCharToMultiByte(
static_cast<UINT
>(m_to_wincp), dwFlagsWCMB, szStackBufferMBWC,
static_cast<int>(count_inter), szStackBufferWCMB, _countof(szStackBufferWCMB), lpDefaultChar, NULL);
267 dst.append(
reinterpret_cast<const T_to*
>(szStackBufferWCMB), strnlen(szStackBufferWCMB, cch));
270 dwResult = GetLastError();
271 if (dwResult == ERROR_INSUFFICIENT_BUFFER) {
273 cch = WideCharToMultiByte(
static_cast<UINT
>(m_to_wincp), dwFlagsWCMB, szStackBufferMBWC,
static_cast<int>(count_inter), NULL, 0, lpDefaultChar, NULL);
274 size_t offset = dst.size();
275 dst.resize(offset + cch);
276 cch = WideCharToMultiByte(
static_cast<UINT
>(m_to_wincp), dwFlagsWCMB, szStackBufferMBWC,
static_cast<int>(count_inter), &dst[offset], cch, lpDefaultChar, NULL);
277 dst.resize(offset + strnlen(&dst[offset], cch));
280 throw std::system_error(dwResult, std::system_category(),
"WideCharToMultiByte failed");
282 dwResult = GetLastError();
283 if (dwResult == ERROR_INSUFFICIENT_BUFFER) {
285 cch = MultiByteToWideChar(
static_cast<UINT
>(m_from_wincp), dwFlagsMBWC,
reinterpret_cast<LPCCH
>(src),
static_cast<int>(count_src), NULL, 0);
286 std::unique_ptr<WCHAR[]> szBufferMBWC(
new WCHAR[cch]);
287 cch = MultiByteToWideChar(
static_cast<UINT
>(m_from_wincp), dwFlagsMBWC,
reinterpret_cast<LPCCH
>(src),
static_cast<int>(count_src), szBufferMBWC.get(), cch);
288 size_t count_inter = count_src != SIZE_MAX ? wcsnlen(szBufferMBWC.get(), cch) :
static_cast<size_t>(cch) - 1;
291 cch = WideCharToMultiByte(
static_cast<UINT
>(m_to_wincp), dwFlagsWCMB, szBufferMBWC.get(),
static_cast<int>(count_inter), NULL, 0, lpDefaultChar, NULL);
292 size_t offset = dst.size();
293 dst.resize(offset + cch);
294 cch = WideCharToMultiByte(
static_cast<UINT
>(m_to_wincp), dwFlagsWCMB, szBufferMBWC.get(),
static_cast<int>(count_inter), &dst[offset], cch, lpDefaultChar, NULL);
295 dst.resize(offset + strnlen(&dst[offset], cch));
298 throw std::system_error(dwResult, std::system_category(),
"MultiByteToWideChar failed");
301 dst.reserve(dst.size() + count_src);
302 T_to buf[1024 /
sizeof(T_to)];
303 size_t src_size = stdex::mul(
sizeof(T_from), count_src);
305 T_to* output = &buf[0];
306 size_t output_size =
sizeof(buf);
308 iconv(m_handle,
const_cast<char**
>(
reinterpret_cast<const char**
>(&src)), &src_size,
reinterpret_cast<char**
>(&output), &output_size);
309 dst.append(buf,
reinterpret_cast<T_to*
>(
reinterpret_cast<char*
>(buf) +
sizeof(buf) - output_size));
314 throw std::system_error(errno, std::system_category(),
"iconv failed");
325 template <
class TR_to = std::
char_traits<T_to>,
class AX_to = std::allocator<T_to>>
327 _Inout_ std::basic_string<T_to, TR_to, AX_to>& dst,
328 _In_z_
const T_from* src)
330 strcat(dst, src, SIZE_MAX);
339 template <
class TR_to = std::
char_traits<T_to>,
class AX_to = std::allocator<T_to>>
341 _Inout_ std::basic_string<T_to, TR_to, AX_to>& dst,
342 _In_
const std::basic_string_view<T_from, std::char_traits<T_from>> src)
344 strcat(dst, src.data(), src.size());
354 template <
class TR_to = std::
char_traits<T_to>,
class AX_to = std::allocator<T_to>>
356 _Inout_ std::basic_string<T_to, TR_to, AX_to>& dst,
357 _In_reads_or_z_opt_(count_src)
const T_from* src, _In_
size_t count_src)
360 strcat(dst, src, count_src);
369 template <
class TR_to = std::
char_traits<T_to>,
class AX_to = std::allocator<T_to>>
371 _Inout_ std::basic_string<T_to, TR_to, AX_to>& dst,
372 _In_z_
const T_from* src)
374 strcpy(dst, src, SIZE_MAX);
383 template <
class TR_to = std::
char_traits<T_to>,
class AX_to = std::allocator<T_to>>
385 _Inout_ std::basic_string<T_to, TR_to, AX_to>& dst,
386 _In_
const std::basic_string_view<T_from, std::char_traits<T_from>> src)
388 strcpy(dst, src.data(), src.size());
397 template <
class TR_to = std::
char_traits<T_to>,
class AX_to = std::allocator<T_to>>
398 std::basic_string<T_to, TR_to, AX_to>
convert(_In_reads_or_z_opt_(count_src)
const T_from* src, _In_
size_t count_src)
400 std::basic_string<T_to, TR_to, AX_to> dst;
401 strcat(dst, src, count_src);
410 template <
class TR_to = std::
char_traits<T_to>,
class AX_to = std::allocator<T_to>>
411 std::basic_string<T_to, TR_to, AX_to>
convert(_In_z_
const T_from* src)
421 template <
class TR_to = std::
char_traits<T_to>,
class AX_to = std::allocator<T_to>>
422 std::basic_string<T_to, TR_to, AX_to>
convert(_In_
const std::basic_string_view<T_from, std::char_traits<T_from>> src)
424 return convert(src.data(), src.size());
430 iconv(m_handle, NULL, NULL, NULL, NULL);
434 static charset_id system_charset()
437 return static_cast<charset_id
>(GetACP());
439 return charset_from_name(nl_langinfo(CODESET));
445 static UINT to_encoding(_In_ charset_id charset)
448 charset == charset_id::system ? GetACP() :
449 charset == charset_id::oem ? GetOEMCP() :
450 static_cast<UINT>(charset);
454 UINT m_from_wincp, m_to_wincp;
457 static const char* to_encoding(_In_ charset_id charset)
459 static const char*
const encodings[
static_cast<std::underlying_type_t<charset_id>
>(charset_id::_max)] = {
463#if BYTE_ORDER == BIG_ENDIAN
475 charset == charset_id::system ? nl_langinfo(CODESET) :
476 encodings[static_cast<std::underlying_type_t<charset_id>>(charset)];
494 template <
class TR_to = std::
char_traits<
wchar_t>,
class AX_to = std::allocator<
wchar_t>>
496 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
499 _Inout_ std::basic_string<wchar_t, TR_to, AX_to>& dst,
500 _In_reads_or_z_opt_(count_src)
const char* src, _In_
size_t count_src,
501 _In_ charset_id charset = charset_id::system)
503 charset_encoder<char, wchar_t>(charset, wchar_t_charset).strcat(dst, src, count_src);
506 template <
class TR_to = std::
char_traits<
wchar_t>,
class AX_to = std::allocator<
wchar_t>>
507 _Deprecated_(
"Use stdex::strcat")
508 inline
void str2wstr(
509 _Inout_ std::basic_string<
wchar_t, TR_to, AX_to>& dst,
510 _In_reads_or_z_opt_(count_src) const
char* src, _In_
size_t count_src,
511 _In_ charset_id charset = charset_id::system)
513 strcat(dst, src, count_src, charset);
525 template <
class TR_to = std::
char_traits<
wchar_t>,
class AX_to = std::allocator<
wchar_t>>
527 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
530 _Inout_ std::basic_string<wchar_t, TR_to, AX_to>& dst,
531 _In_
const std::basic_string_view<
char, std::char_traits<char>> src,
532 _In_ charset_id charset = charset_id::system)
534 strcat(dst, src.data(), src.size(), charset);
537 template <
class TR_to = std::
char_traits<
wchar_t>,
class AX_to = std::allocator<
wchar_t>>
538 _Deprecated_(
"Use stdex::strcat")
539 inline
void str2wstr(
540 _Inout_ std::basic_string<
wchar_t, TR_to, AX_to>& dst,
541 _In_ const std::basic_string_view<
char, std::char_traits<
char>> src,
542 _In_ charset_id charset = charset_id::system)
544 strcat(dst, src, charset);
557 template <
class TR_to = std::
char_traits<
wchar_t>,
class AX_to = std::allocator<
wchar_t>>
559 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
562 _Inout_ std::basic_string<wchar_t, TR_to, AX_to>& dst,
563 _In_reads_or_z_opt_(count_src)
const char* src, _In_
size_t count_src,
564 _In_ charset_id charset = charset_id::system)
567 strcat(dst, src, count_src, charset);
579 template <
class TR_to = std::
char_traits<
wchar_t>,
class AX_to = std::allocator<
wchar_t>>
581 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
584 _Inout_ std::basic_string<wchar_t, TR_to, AX_to>& dst,
585 _In_
const std::basic_string_view<
char, std::char_traits<char>> src,
586 _In_ charset_id charset = charset_id::system)
588 strcpy(dst, src.data(), src.size(), charset);
602 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
604 inline std::wstring str2wstr(
605 _In_z_
const char* src,
606 _In_ charset_id charset = charset_id::system)
609 strcat(dst, src, SIZE_MAX, charset);
625 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
627 inline std::wstring str2wstr(
628 _In_reads_or_z_opt_(count_src)
const char* src, _In_
size_t count_src,
629 _In_ charset_id charset = charset_id::system)
632 strcat(dst, src, count_src, charset);
647 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
649 inline std::wstring str2wstr(
650 _In_
const std::basic_string_view<
char, std::char_traits<char>> src,
651 _In_ charset_id charset = charset_id::system)
653 return str2wstr(src.data(), src.size(), charset);
666 template <
class TR_to = std::
char_traits<
char>,
class AX_to = std::allocator<
char>>
668 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
671 _Inout_ std::basic_string<char, TR_to, AX_to>& dst,
672 _In_reads_or_z_opt_(count_src)
const wchar_t* src, _In_
size_t count_src,
673 _In_ charset_id charset = charset_id::system)
675 charset_encoder<wchar_t, char>(wchar_t_charset, charset).strcat(dst, src, count_src);
678 template <
class TR_to = std::
char_traits<
char>,
class AX_to = std::allocator<
char>>
679 _Deprecated_(
"Use stdex::strcat")
680 inline
void wstr2str(
681 _Inout_ std::basic_string<
char, TR_to, AX_to>& dst,
682 _In_reads_or_z_opt_(count_src) const
wchar_t* src, _In_
size_t count_src,
683 _In_ charset_id charset = charset_id::system)
685 strcat(dst, src, count_src, charset);
697 template <
class TR_to = std::
char_traits<
char>,
class AX_to = std::allocator<
char>>
699 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
702 _Inout_ std::basic_string<char, TR_to, AX_to>& dst,
703 _In_
const std::basic_string_view<
wchar_t, std::char_traits<wchar_t>> src,
704 _In_ charset_id charset = charset_id::system)
706 strcat(dst, src.data(), src.size(), charset);
709 template <
class TR_to = std::
char_traits<
char>,
class AX_to = std::allocator<
char>>
710 _Deprecated_(
"Use stdex::strcat")
711 inline
void wstr2str(
712 _Inout_ std::basic_string<
char, TR_to, AX_to>& dst,
713 _In_ const std::basic_string_view<
wchar_t, std::char_traits<
wchar_t>> src,
714 _In_ charset_id charset = charset_id::system)
716 strcat(dst, src, charset);
729 template <
class TR_to = std::
char_traits<
char>,
class AX_to = std::allocator<
char>>
731 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
734 _Inout_ std::basic_string<char, TR_to, AX_to>& dst,
735 _In_reads_or_z_opt_(count_src)
const wchar_t* src, _In_
size_t count_src,
736 _In_ charset_id charset = charset_id::system)
739 strcat(dst, src, count_src, charset);
751 template <
class TR_to = std::
char_traits<
char>,
class AX_to = std::allocator<
char>>
753 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
756 _Inout_ std::basic_string<char, TR_to, AX_to>& dst,
757 _In_
const std::basic_string_view<
wchar_t, std::char_traits<wchar_t>> src,
758 _In_ charset_id charset = charset_id::system)
760 strcpy(dst, src.data(), src.size(), charset);
774 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
776 inline std::string wstr2str(
777 _In_z_
const wchar_t* src,
778 _In_ charset_id charset = charset_id::system)
781 strcat(dst, src, SIZE_MAX, charset);
797 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
799 inline std::string wstr2str(
800 _In_reads_or_z_opt_(count_src)
const wchar_t* src, _In_
size_t count_src,
801 _In_ charset_id charset = charset_id::system)
804 strcat(dst, src, count_src, charset);
819 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
821 inline std::string wstr2str(
822 _In_
const std::basic_string_view<
wchar_t, std::char_traits<wchar_t>> src,
823 _In_ charset_id charset = charset_id::system)
825 return wstr2str(src.data(), src.size(), charset);
838 template <
class TR = std::
char_traits<
wchar_t>,
class AX = std::allocator<
wchar_t>>
840 _Inout_ std::basic_string<wchar_t, TR, AX>& dst,
841 _In_reads_or_z_opt_(count_src)
const wchar_t* src, _In_
size_t count_src)
843 count_src = strnlen(src, count_src);
844 size_t count_dst = dst.size();
845 dst.resize(count_dst + count_src);
846 _Assume_(count_src + 1 < INT_MAX);
847#pragma warning(suppress: 6387)
848 int r = NormalizeString(NormalizationC, src,
static_cast<int>(count_src), dst.data() + count_dst,
static_cast<int>(count_src + 1));
850 dst.resize(count_dst + r);
852#pragma warning(suppress: 6387)
853 memcpy(dst.data() + count_dst, src, count_src *
sizeof(
wchar_t));
865 template <
size_t N,
class TR = std::
char_traits<
wchar_t>,
class AX = std::allocator<
wchar_t>>
867 _Inout_ std::basic_string<wchar_t, TR, AX>& dst,
868 _In_
const wchar_t (&src)[N])
870 return normalizecat(dst, src, N);
881 template <
class TR_dst = std::
char_traits<
wchar_t>,
class AX_dst = std::allocator<
wchar_t>>
883 _Inout_ std::basic_string<wchar_t, TR_dst, AX_dst>& dst,
884 _In_
const std::basic_string_view<
wchar_t, std::char_traits<wchar_t>> src)
886 return normalizecat(dst, src.data(), src.size());
898 template <
class TR = std::
char_traits<
wchar_t>,
class AX = std::allocator<
wchar_t>>
900 _Inout_ std::basic_string<wchar_t, TR, AX>& dst,
901 _In_reads_or_z_opt_(count_src)
const wchar_t* src, _In_
size_t count_src)
904 return normalizecat(dst, src, count_src);
915 template <
size_t N,
class TR = std::
char_traits<
wchar_t>,
class AX = std::allocator<
wchar_t>>
917 _Inout_ std::basic_string<wchar_t, TR, AX>& dst,
918 _In_
const wchar_t(&src)[N])
920 return normalize(dst, src, N);
931 template <
class TR_dst = std::
char_traits<
wchar_t>,
class AX_dst = std::allocator<
wchar_t>>
933 _Inout_ std::basic_string<wchar_t, TR_dst, AX_dst>& dst,
934 _In_
const std::basic_string_view<
wchar_t, std::char_traits<wchar_t>> src)
936 return normalize(dst, src.data(), src.size());
947 inline std::wstring normalize(_In_reads_or_z_opt_(count_src)
const wchar_t* src, _In_
size_t count_src)
950 normalizecat(dst, src, count_src);
962 std::wstring normalize(_In_
const wchar_t(&src)[N])
965 normalizecat(dst, src, N);
976 inline std::wstring normalize(_In_
const std::basic_string_view<
wchar_t, std::char_traits<wchar_t>> src)
979 normalizecat(dst, src.data(), src.size());
986#pragma GCC diagnostic pop
Encoding converter context.
Definition unicode.hpp:138
void strcat(std::basic_string< T_to, TR_to, AX_to > &dst, _In_reads_or_z_opt_(count_src) const T_from *src, size_t count_src)
Convert string and append to string.
Definition unicode.hpp:175
void strcat(std::basic_string< T_to, TR_to, AX_to > &dst, const std::basic_string_view< T_from, std::char_traits< T_from > > src)
Convert string and append to string.
Definition unicode.hpp:340
void strcpy(std::basic_string< T_to, TR_to, AX_to > &dst, const T_from *src)
Convert string.
Definition unicode.hpp:370
void strcat(std::basic_string< T_to, TR_to, AX_to > &dst, const T_from *src)
Convert string and append to string.
Definition unicode.hpp:326
void strcpy(std::basic_string< T_to, TR_to, AX_to > &dst, _In_reads_or_z_opt_(count_src) const T_from *src, size_t count_src)
Convert string.
Definition unicode.hpp:355
std::basic_string< T_to, TR_to, AX_to > convert(const T_from *src)
Return converted string.
Definition unicode.hpp:411
void strcpy(std::basic_string< T_to, TR_to, AX_to > &dst, const std::basic_string_view< T_from, std::char_traits< T_from > > src)
Convert string.
Definition unicode.hpp:384
std::basic_string< T_to, TR_to, AX_to > convert(const std::basic_string_view< T_from, std::char_traits< T_from > > src)
Return converted string.
Definition unicode.hpp:422
std::basic_string< T_to, TR_to, AX_to > convert(_In_reads_or_z_opt_(count_src) const T_from *src, size_t count_src)
Return converted string.
Definition unicode.hpp:398