Как уже отмечалось, wchar_t абсолютно не нужен для поддержки юникода. Мало того, это также совершенно бесполезно для этой цели, так как стандарт не предоставляет гарантию фиксированного размера для wchar_t (другими словами, вы заранее не знаете, какой sizeof (wchar_t) будет в конкретной системе), тогда как sizeof (char) всегда будет 1.
В кодировке UTF-8 любой действительный символ UNICODE сопоставляется с последовательностью из одного или нескольких (я полагаю, до четырех) октетов.
В кодировке UTF-16 любой действительный символ UNICODE отображается в последовательность из одного или нескольких (я полагаю, до двух) 16-битных слов.
В кодировке UTF-32 любой фактический символ UNICODE отображается точно в одно 32-битное слово.
Как видите, wchar_t может быть полезен для реализации поддержки UTF-16 IF стандарт был достаточно хорош, чтобы гарантировать, что wchar_t всегда имеет ширину 16 бит. К сожалению, это не так, поэтому вам все равно придется возвращаться к целочисленному типу фиксированной ширины из <cstdint>
(например, std :: uint16_t).
<slightly OffTopic Microsoft-specific rant>
Что еще более раздражает, так это дополнительная путаница, вызванная конфигурациями сборки Microsoft Visual Studio UNICODE и MBCS (многобайтовый набор символов). Оба они
А) сбивает с толку и
Б) откровенная ложь
потому что ни конфигурация «UNICODE» в Visual Studio не делает ничего, чтобы купить программисту фактическую поддержку Unicode, ни различие, подразумеваемое этими двумя конфигурациями сборки, не имеет никакого смысла. Для объяснения Microsoft рекомендует использовать TCHAR вместо использования char или wchar_t напрямую. В конфигурации MBCS TCHAR расширяется до char, что означает, что вы потенциально можете использовать это для реализации поддержки UTF-8. В конфигурации UNICODE он расширяется до wchar_t, который в Visual Studio имеет ширину 16 бит и потенциально может быть использован для реализации поддержки UTF-16 (насколько мне известно, это встроенная кодировка, используемая Windows) , Однако оба этих кодировок являются многобайтовыми наборами символов, поскольку как UTF-8, так и UTF-16 допускают возможность того, что конкретный символ Unicode может быть закодирован как более одного char / wchar_t соответственно, поэтому термин многобайтовый набор символов (в отличие от однобайтового набора символов?) имеет мало смысла.
Чтобы добавить оскорбление к травме, простое использование конфигурации Unicode фактически не дает вам ни йоты поддержки Unicode. Чтобы действительно получить это, вы должны использовать реальную библиотеку Unicode, такую как ICU (http://site.icu -project.org / ). Короче говоря, тип wchar_t и конфигурации Microsoft MBCS и UNICODE ничего не добавляют и не вызывают ненужной путаницы, и мир стал бы значительно лучше, если бы ни один из них не был изобретен.
</slightly OffTopic Microsoft-specific rant>