Тип
WCHAR
зависит от настроек проекта и может быть как псевдонимом
char
, так и
wchar_t
. Широкое использование этого типа во всем проекте не рекомендуется, т.к. повсеместно вносит неопределенность.
Для хранения Unicode строк (у тебя же 2017 студия и c++17 по умолчанию) уже давно существует сразу
несколько типов строк:
std::wstring
,
std::u16string
и
std::u32string
.
Тип
std::wstring
хранит символы типа
wchar_t
, который, в зависимости от настроек компилятора, может занимать 2 или 4 бйта. Это делает тип
std::wstring
столь же неоднозначным, как и
WCHAR
. Поэтому и были созданы типы со строгим размером символа:
std::u16string
и
std::u32string
. Сейчас рекомендуется пользоваться ими вместе с
std::string
.
Сам твой вопрос заключается не в преобразовании типа, т.к. это легко сделать с помощью
std::transform
и лямбды, а в преобразовании однобайтовой (std::string) кодировки в Unicode и обратно.
Для этого в стандартной библиотеке уже тоже есть
всё нужное.
Пример кодаtemplate< typename TCharType, typename TCharTraits, typename TStringAllocator >
inline void Convert( const std::string& source_string, std::basic_string<TCharType, TCharTraits, TStringAllocator>& dest_string )
{
std::wstring_convert<std::codecvt_utf8_utf16<TCharType>, TCharType> converter;
dest_string = converter.from_bytes( source_string );
}
template< typename TCharType, typename TCharTraits, typename TStringAllocator >
inline void Convert( const std::basic_string<TCharType, TCharTraits, TStringAllocator>& source_string, std::string& dest_string )
{
std::wstring_convert<std::codecvt_utf8_utf16<TCharType>, TCharType> converter;
dest_string = converter.to_bytes( source_string );
}
А помимо стандартной библиотеки все нужное есть еще и в
WinAPI, и в
C Run-Time Library.