The C-library solution for converting between the system's narrow and wide encoding use the mbsrtowcs and wcsrtombs functions from the <cwchar> header. I've spelt this out in this answer.
In C++11, you can use the wstring_convert template instantiated with a suitable codecvt facet. Unfortunately this requires some custom rigging, which is spelt out on the cppreference page.
I've adapted it here into a self-contained example which converts a wstring to a string, converting from the system's wide into the system's narrow encoding:
#include <iostream> #include <string> #include <locale> #include <codecvt> // utility wrapper to adapt locale-bound facets for wstring/wbuffer convert template <typename Facet> struct deletable_facet : Facet { using Facet::Facet; }; int main() { std::wstring_convert< deletable_facet<std::codecvt<wchar_t, char, std::mbstate_t>>> conv; std::wstring ws(L"Hello world."); std::string ns = conv.to_bytes(ws); std::cout << ns << std::endl; }