Я на самом деле написал широко используемое приложение (более 5 миллионов пользователей), поэтому каждый используемый килобайт буквально складывается. Несмотря на это, я просто придерживался wxString. Я настроил его для получения из std :: wstring, чтобы я мог передать их функциям, ожидающим wstring const &.
Обратите внимание, что std :: wstring является нативным Unicode на Mac (для символов выше U + 10000 не требуется UTF-16), поэтому он использует 4 байта / wchar_t. Большим преимуществом этого является то, что i ++ всегда дает вам следующий символ. На Win32 это верно только в 99,9% случаев. Как программист, вы поймете, насколько мало 99,9%.
Но если вы не уверены, напишите функцию в верхнем регистре: std :: string [UTF-8] и std :: wstring. Эти две функции скажут вам, какой путь - безумие.
Ваш формат на диске - другое дело. Для переносимости это должно быть UTF-8. В UTF-8 нет проблем с порядком байтов, и не обсуждается вопрос о ширине (2/4). Возможно, поэтому многие программы используют UTF-8.
На немного не связанной ноте, пожалуйста, ознакомьтесь со сравнениями и нормализацией строк Unicode. Или вы получите ту же ошибку, что и в .NET, где у вас могут быть две переменные föö и föö, отличающиеся только (невидимой) нормализацией.