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 DWORD dwFlagsMBWC =
static_cast<UINT
>(m_from_wincp) < CP_UTF7 ? MB_PRECOMPOSED : 0;
186 constexpr DWORD dwFlagsWCMB = 0;
187 constexpr LPCCH lpDefaultChar = NULL;
190 if (m_from_wincp == m_to_wincp) _Unlikely_{
191 dst.append(
reinterpret_cast<const T_to*
>(src), count_src);
195#pragma warning(suppress: 4127)
196 if constexpr (
sizeof(T_from) ==
sizeof(
char) &&
sizeof(T_to) ==
sizeof(
wchar_t)) {
197 _Assume_(count_src < INT_MAX || count_src == SIZE_MAX);
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 if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
210 cch = MultiByteToWideChar(
static_cast<UINT
>(m_from_wincp), dwFlagsMBWC,
reinterpret_cast<LPCCH
>(src),
static_cast<int>(count_src), NULL, 0);
211 size_t offset = dst.size();
212 dst.resize(offset +
static_cast<size_t>(cch));
213 cch = MultiByteToWideChar(
static_cast<UINT
>(m_from_wincp), dwFlagsMBWC,
reinterpret_cast<LPCCH
>(src),
static_cast<int>(count_src), &dst[offset], cch);
214 dst.resize(offset + (count_src != SIZE_MAX ? wcsnlen(&dst[offset], cch) :
static_cast<size_t>(cch) - 1));
217 throw std::system_error(GetLastError(), std::system_category(),
"MultiByteToWideChar failed");
220#pragma warning(suppress: 4127)
221 if constexpr (
sizeof(T_from) ==
sizeof(
wchar_t) &&
sizeof(T_to) ==
sizeof(
char)) {
222 _Assume_(count_src < INT_MAX || count_src == SIZE_MAX);
225 CHAR szStackBuffer[1024 /
sizeof(CHAR)];
226#pragma warning(suppress: 6387)
227 int cch = WideCharToMultiByte(
static_cast<UINT
>(m_to_wincp), dwFlagsWCMB,
reinterpret_cast<LPCWCH
>(src),
static_cast<int>(count_src), szStackBuffer, _countof(szStackBuffer), lpDefaultChar, NULL);
230 dst.append(
reinterpret_cast<const T_to*
>(szStackBuffer), count_src != SIZE_MAX ? strnlen(szStackBuffer, cch) :
static_cast<size_t>(cch) - 1);
233 if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
235 cch = WideCharToMultiByte(
static_cast<UINT
>(m_to_wincp), dwFlagsWCMB,
reinterpret_cast<LPCWCH
>(src),
static_cast<int>(count_src), NULL, 0, lpDefaultChar, NULL);
236 size_t offset = dst.size();
237 dst.resize(offset +
static_cast<size_t>(cch));
238 cch = WideCharToMultiByte(
static_cast<UINT
>(m_to_wincp), dwFlagsWCMB,
reinterpret_cast<LPCWCH
>(src),
static_cast<int>(count_src), &dst[offset], cch, lpDefaultChar, NULL);
239 dst.resize(offset + (count_src != SIZE_MAX ? strnlen(&dst[offset], cch) :
static_cast<size_t>(cch) - 1));
242 throw std::system_error(GetLastError(), std::system_category(),
"WideCharToMultiByte failed");
245#pragma warning(suppress: 4127)
246 if constexpr (
sizeof(T_from) ==
sizeof(
char) &&
sizeof(T_to) ==
sizeof(
char)) {
247 _Assume_(count_src < INT_MAX || count_src == SIZE_MAX);
250 WCHAR szStackBufferMBWC[512 /
sizeof(WCHAR)];
251#pragma warning(suppress: 6387)
252 int cch = MultiByteToWideChar(
static_cast<UINT
>(m_from_wincp), dwFlagsMBWC,
reinterpret_cast<LPCCH
>(src),
static_cast<int>(count_src), szStackBufferMBWC, _countof(szStackBufferMBWC));
255 size_t count_inter = count_src != SIZE_MAX ? wcsnlen(szStackBufferMBWC, cch) :
static_cast<size_t>(cch) - 1;
256 _Assume_(count_inter < INT_MAX);
259 CHAR szStackBufferWCMB[512 /
sizeof(CHAR)];
260#pragma warning(suppress: 6387)
261 cch = WideCharToMultiByte(
static_cast<UINT
>(m_to_wincp), dwFlagsWCMB, szStackBufferMBWC,
static_cast<int>(count_inter), szStackBufferWCMB, _countof(szStackBufferWCMB), lpDefaultChar, NULL);
264 dst.append(
reinterpret_cast<const T_to*
>(szStackBufferWCMB), strnlen(szStackBufferWCMB, cch));
267 if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
269 cch = WideCharToMultiByte(
static_cast<UINT
>(m_to_wincp), dwFlagsWCMB, szStackBufferMBWC,
static_cast<int>(count_inter), NULL, 0, lpDefaultChar, NULL);
270 size_t offset = dst.size();
271 dst.resize(offset + cch);
272 cch = WideCharToMultiByte(
static_cast<UINT
>(m_to_wincp), dwFlagsWCMB, szStackBufferMBWC,
static_cast<int>(count_inter), &dst[offset], cch, lpDefaultChar, NULL);
273 dst.resize(offset + strnlen(&dst[offset], cch));
276 throw std::system_error(GetLastError(), std::system_category(),
"WideCharToMultiByte failed");
278 if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
280 cch = MultiByteToWideChar(
static_cast<UINT
>(m_from_wincp), dwFlagsMBWC,
reinterpret_cast<LPCCH
>(src),
static_cast<int>(count_src), NULL, 0);
281 std::unique_ptr<WCHAR[]> szBufferMBWC(
new WCHAR[cch]);
282 cch = MultiByteToWideChar(
static_cast<UINT
>(m_from_wincp), dwFlagsMBWC,
reinterpret_cast<LPCCH
>(src),
static_cast<int>(count_src), szBufferMBWC.get(), cch);
283 size_t count_inter = count_src != SIZE_MAX ? wcsnlen(szBufferMBWC.get(), cch) :
static_cast<size_t>(cch) - 1;
286 cch = WideCharToMultiByte(
static_cast<UINT
>(m_to_wincp), dwFlagsWCMB, szBufferMBWC.get(),
static_cast<int>(count_inter), NULL, 0, lpDefaultChar, NULL);
287 size_t offset = dst.size();
288 dst.resize(offset + cch);
289 cch = WideCharToMultiByte(
static_cast<UINT
>(m_to_wincp), dwFlagsWCMB, szBufferMBWC.get(),
static_cast<int>(count_inter), &dst[offset], cch, lpDefaultChar, NULL);
290 dst.resize(offset + strnlen(&dst[offset], cch));
293 throw std::system_error(GetLastError(), std::system_category(),
"MultiByteToWideChar failed");
296 dst.reserve(dst.size() + count_src);
297 T_to buf[1024 /
sizeof(T_to)];
298 size_t src_size = stdex::mul(
sizeof(T_from), count_src);
300 T_to* output = &buf[0];
301 size_t output_size =
sizeof(buf);
303 iconv(m_handle,
const_cast<char**
>(
reinterpret_cast<const char**
>(&src)), &src_size,
reinterpret_cast<char**
>(&output), &output_size);
304 dst.append(buf,
reinterpret_cast<T_to*
>(
reinterpret_cast<char*
>(buf) +
sizeof(buf) - output_size));
309 throw std::system_error(errno, std::system_category(),
"iconv failed");
320 template <
class TR_to = std::
char_traits<T_to>,
class AX_to = std::allocator<T_to>>
322 _Inout_ std::basic_string<T_to, TR_to, AX_to>& dst,
323 _In_z_
const T_from* src)
325 strcat(dst, src, SIZE_MAX);
334 template <
class TR_to = std::
char_traits<T_to>,
class AX_to = std::allocator<T_to>>
336 _Inout_ std::basic_string<T_to, TR_to, AX_to>& dst,
337 _In_
const std::basic_string_view<T_from, std::char_traits<T_from>> src)
339 strcat(dst, src.data(), src.size());
349 template <
class TR_to = std::
char_traits<T_to>,
class AX_to = std::allocator<T_to>>
351 _Inout_ std::basic_string<T_to, TR_to, AX_to>& dst,
352 _In_reads_or_z_opt_(count_src)
const T_from* src, _In_
size_t count_src)
355 strcat(dst, src, count_src);
364 template <
class TR_to = std::
char_traits<T_to>,
class AX_to = std::allocator<T_to>>
366 _Inout_ std::basic_string<T_to, TR_to, AX_to>& dst,
367 _In_z_
const T_from* src)
369 strcpy(dst, src, SIZE_MAX);
378 template <
class TR_to = std::
char_traits<T_to>,
class AX_to = std::allocator<T_to>>
380 _Inout_ std::basic_string<T_to, TR_to, AX_to>& dst,
381 _In_
const std::basic_string_view<T_from, std::char_traits<T_from>> src)
383 strcpy(dst, src.data(), src.size());
392 template <
class TR_to = std::
char_traits<T_to>,
class AX_to = std::allocator<T_to>>
393 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)
395 std::basic_string<T_to, TR_to, AX_to> dst;
396 strcat(dst, src, count_src);
405 template <
class TR_to = std::
char_traits<T_to>,
class AX_to = std::allocator<T_to>>
406 std::basic_string<T_to, TR_to, AX_to>
convert(_In_z_
const T_from* src)
416 template <
class TR_to = std::
char_traits<T_to>,
class AX_to = std::allocator<T_to>>
417 std::basic_string<T_to, TR_to, AX_to>
convert(_In_
const std::basic_string_view<T_from, std::char_traits<T_from>> src)
419 return convert(src.data(), src.size());
425 iconv(m_handle, NULL, NULL, NULL, NULL);
429 static charset_id system_charset()
432 return static_cast<charset_id
>(GetACP());
434 return charset_from_name(nl_langinfo(CODESET));
440 static UINT to_encoding(_In_ charset_id charset)
443 charset == charset_id::system ? GetACP() :
444 charset == charset_id::oem ? GetOEMCP() :
445 static_cast<UINT>(charset);
449 UINT m_from_wincp, m_to_wincp;
452 static const char* to_encoding(_In_ charset_id charset)
454 static const char*
const encodings[
static_cast<std::underlying_type_t<charset_id>
>(charset_id::_max)] = {
458#if BYTE_ORDER == BIG_ENDIAN
470 charset == charset_id::system ? nl_langinfo(CODESET) :
471 encodings[static_cast<std::underlying_type_t<charset_id>>(charset)];
489 template <
class TR_to = std::
char_traits<
wchar_t>,
class AX_to = std::allocator<
wchar_t>>
491 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
494 _Inout_ std::basic_string<wchar_t, TR_to, AX_to>& dst,
495 _In_reads_or_z_opt_(count_src)
const char* src, _In_
size_t count_src,
496 _In_ charset_id charset = charset_id::system)
498 charset_encoder<char, wchar_t>(charset, wchar_t_charset).strcat(dst, src, count_src);
501 template <
class TR_to = std::
char_traits<
wchar_t>,
class AX_to = std::allocator<
wchar_t>>
502 _Deprecated_(
"Use stdex::strcat")
503 inline
void str2wstr(
504 _Inout_ std::basic_string<
wchar_t, TR_to, AX_to>& dst,
505 _In_reads_or_z_opt_(count_src) const
char* src, _In_
size_t count_src,
506 _In_ charset_id charset = charset_id::system)
508 strcat(dst, src, count_src, charset);
520 template <
class TR_to = std::
char_traits<
wchar_t>,
class AX_to = std::allocator<
wchar_t>>
522 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
525 _Inout_ std::basic_string<wchar_t, TR_to, AX_to>& dst,
526 _In_
const std::basic_string_view<
char, std::char_traits<char>> src,
527 _In_ charset_id charset = charset_id::system)
529 strcat(dst, src.data(), src.size(), charset);
532 template <
class TR_to = std::
char_traits<
wchar_t>,
class AX_to = std::allocator<
wchar_t>>
533 _Deprecated_(
"Use stdex::strcat")
534 inline
void str2wstr(
535 _Inout_ std::basic_string<
wchar_t, TR_to, AX_to>& dst,
536 _In_ const std::basic_string_view<
char, std::char_traits<
char>> src,
537 _In_ charset_id charset = charset_id::system)
539 strcat(dst, src, charset);
552 template <
class TR_to = std::
char_traits<
wchar_t>,
class AX_to = std::allocator<
wchar_t>>
554 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
557 _Inout_ std::basic_string<wchar_t, TR_to, AX_to>& dst,
558 _In_reads_or_z_opt_(count_src)
const char* src, _In_
size_t count_src,
559 _In_ charset_id charset = charset_id::system)
562 strcat(dst, src, count_src, charset);
574 template <
class TR_to = std::
char_traits<
wchar_t>,
class AX_to = std::allocator<
wchar_t>>
576 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
579 _Inout_ std::basic_string<wchar_t, TR_to, AX_to>& dst,
580 _In_
const std::basic_string_view<
char, std::char_traits<char>> src,
581 _In_ charset_id charset = charset_id::system)
583 strcpy(dst, src.data(), src.size(), charset);
597 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
599 inline std::wstring str2wstr(
600 _In_z_
const char* src,
601 _In_ charset_id charset = charset_id::system)
604 strcat(dst, src, SIZE_MAX, charset);
620 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
622 inline std::wstring str2wstr(
623 _In_reads_or_z_opt_(count_src)
const char* src, _In_
size_t count_src,
624 _In_ charset_id charset = charset_id::system)
627 strcat(dst, src, count_src, charset);
642 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
644 inline std::wstring str2wstr(
645 _In_
const std::basic_string_view<
char, std::char_traits<char>> src,
646 _In_ charset_id charset = charset_id::system)
648 return str2wstr(src.data(), src.size(), charset);
661 template <
class TR_to = std::
char_traits<
char>,
class AX_to = std::allocator<
char>>
663 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
666 _Inout_ std::basic_string<char, TR_to, AX_to>& dst,
667 _In_reads_or_z_opt_(count_src)
const wchar_t* src, _In_
size_t count_src,
668 _In_ charset_id charset = charset_id::system)
670 charset_encoder<wchar_t, char>(wchar_t_charset, charset).strcat(dst, src, count_src);
673 template <
class TR_to = std::
char_traits<
char>,
class AX_to = std::allocator<
char>>
674 _Deprecated_(
"Use stdex::strcat")
675 inline
void wstr2str(
676 _Inout_ std::basic_string<
char, TR_to, AX_to>& dst,
677 _In_reads_or_z_opt_(count_src) const
wchar_t* src, _In_
size_t count_src,
678 _In_ charset_id charset = charset_id::system)
680 strcat(dst, src, count_src, charset);
692 template <
class TR_to = std::
char_traits<
char>,
class AX_to = std::allocator<
char>>
694 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
697 _Inout_ std::basic_string<char, TR_to, AX_to>& dst,
698 _In_
const std::basic_string_view<
wchar_t, std::char_traits<wchar_t>> src,
699 _In_ charset_id charset = charset_id::system)
701 strcat(dst, src.data(), src.size(), charset);
704 template <
class TR_to = std::
char_traits<
char>,
class AX_to = std::allocator<
char>>
705 _Deprecated_(
"Use stdex::strcat")
706 inline
void wstr2str(
707 _Inout_ std::basic_string<
char, TR_to, AX_to>& dst,
708 _In_ const std::basic_string_view<
wchar_t, std::char_traits<
wchar_t>> src,
709 _In_ charset_id charset = charset_id::system)
711 strcat(dst, src, charset);
724 template <
class TR_to = std::
char_traits<
char>,
class AX_to = std::allocator<
char>>
726 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
729 _Inout_ std::basic_string<char, TR_to, AX_to>& dst,
730 _In_reads_or_z_opt_(count_src)
const wchar_t* src, _In_
size_t count_src,
731 _In_ charset_id charset = charset_id::system)
734 strcat(dst, src, count_src, charset);
746 template <
class TR_to = std::
char_traits<
char>,
class AX_to = std::allocator<
char>>
748 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
751 _Inout_ std::basic_string<char, TR_to, AX_to>& dst,
752 _In_
const std::basic_string_view<
wchar_t, std::char_traits<wchar_t>> src,
753 _In_ charset_id charset = charset_id::system)
755 strcpy(dst, src.data(), src.size(), charset);
769 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
771 inline std::string wstr2str(
772 _In_z_
const wchar_t* src,
773 _In_ charset_id charset = charset_id::system)
776 strcat(dst, src, SIZE_MAX, charset);
792 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
794 inline std::string wstr2str(
795 _In_reads_or_z_opt_(count_src)
const wchar_t* src, _In_
size_t count_src,
796 _In_ charset_id charset = charset_id::system)
799 strcat(dst, src, count_src, charset);
814 _Deprecated_(
"For better performance, consider a reusable charset_encoder")
816 inline std::string wstr2str(
817 _In_
const std::basic_string_view<
wchar_t, std::char_traits<wchar_t>> src,
818 _In_ charset_id charset = charset_id::system)
820 return wstr2str(src.data(), src.size(), charset);
833 template <
class TR = std::
char_traits<
wchar_t>,
class AX = std::allocator<
wchar_t>>
835 _Inout_ std::basic_string<wchar_t, TR, AX>& dst,
836 _In_reads_or_z_opt_(count_src)
const wchar_t* src, _In_
size_t count_src)
838 count_src = strnlen(src, count_src);
839 size_t count_dst = dst.size();
840 dst.resize(count_dst + count_src);
841 _Assume_(count_src + 1 < INT_MAX);
842#pragma warning(suppress: 6387)
843 int r = NormalizeString(NormalizationC, src,
static_cast<int>(count_src), dst.data() + count_dst,
static_cast<int>(count_src + 1));
845 dst.resize(count_dst + r);
847#pragma warning(suppress: 6387)
848 memcpy(dst.data() + count_dst, src, count_src *
sizeof(
wchar_t));
860 template <
size_t N,
class TR = std::
char_traits<
wchar_t>,
class AX = std::allocator<
wchar_t>>
862 _Inout_ std::basic_string<wchar_t, TR, AX>& dst,
863 _In_
const wchar_t (&src)[N])
865 return normalizecat(dst, src, N);
876 template <
class TR_dst = std::
char_traits<
wchar_t>,
class AX_dst = std::allocator<
wchar_t>>
878 _Inout_ std::basic_string<wchar_t, TR_dst, AX_dst>& dst,
879 _In_
const std::basic_string_view<
wchar_t, std::char_traits<wchar_t>> src)
881 return normalizecat(dst, src.data(), src.size());
893 template <
class TR = std::
char_traits<
wchar_t>,
class AX = std::allocator<
wchar_t>>
895 _Inout_ std::basic_string<wchar_t, TR, AX>& dst,
896 _In_reads_or_z_opt_(count_src)
const wchar_t* src, _In_
size_t count_src)
899 return normalizecat(dst, src, count_src);
910 template <
size_t N,
class TR = std::
char_traits<
wchar_t>,
class AX = std::allocator<
wchar_t>>
912 _Inout_ std::basic_string<wchar_t, TR, AX>& dst,
913 _In_
const wchar_t(&src)[N])
915 return normalize(dst, src, N);
926 template <
class TR_dst = std::
char_traits<
wchar_t>,
class AX_dst = std::allocator<
wchar_t>>
928 _Inout_ std::basic_string<wchar_t, TR_dst, AX_dst>& dst,
929 _In_
const std::basic_string_view<
wchar_t, std::char_traits<wchar_t>> src)
931 return normalize(dst, src.data(), src.size());
942 inline std::wstring normalize(_In_reads_or_z_opt_(count_src)
const wchar_t* src, _In_
size_t count_src)
945 normalizecat(dst, src, count_src);
957 std::wstring normalize(_In_
const wchar_t(&src)[N])
960 normalizecat(dst, src, N);
971 inline std::wstring normalize(_In_
const std::basic_string_view<
wchar_t, std::char_traits<wchar_t>> src)
974 normalizecat(dst, src.data(), src.size());
981#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:335
void strcpy(std::basic_string< T_to, TR_to, AX_to > &dst, const T_from *src)
Convert string.
Definition unicode.hpp:365
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:321
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:350
std::basic_string< T_to, TR_to, AX_to > convert(const T_from *src)
Return converted string.
Definition unicode.hpp:406
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:379
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:417
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:393