std :: wstring - технически UCS-2: для каждого символа используются два байта, а кодовые таблицы в основном отображаются в формат Unicode. Важно понимать, что UCS-2 - это не то же самое, что UTF-16! UTF-16 допускает «суррогатные пары» для представления символов, которые находятся за пределами двухбайтового диапазона, но UCS-2 использует ровно два байта для каждого символа, точка.
Лучшее правило для вашей ситуации - выполнять перекодирование при чтении и записи на диск. Как только он окажется в памяти, сохраните его в формате UCS-2. API-интерфейсы Windows будут читать его так, как если бы он был UTF-16 (то есть, пока std :: wstring не понимает концепцию суррогатных пар, если вы создаете их вручную (чего не будет, если ваш единственный язык - Англ), винда их прочтет).
Когда бы вы ни читали данные в форматах сериализации или вне их (например, XML) в наше время, вам, вероятно, придется выполнять транскодирование. Это неприятный и очень прискорбный факт из жизни, но он неизбежен, так как Unicode - это кодировка символов переменной ширины, и большинство символьных операций в C ++ выполняются как массивы, для которых вам нужен постоянный интервал.
Инфраструктуры более высокого уровня, такие как .NET, скрывают большинство деталей, но за кадром они обрабатывают транскодирование таким же образом: изменяя данные переменной ширины на строки фиксированной ширины, манипулируя ими, и затем изменяя их обратно в кодировки переменной ширины, когда это требуется для вывода.