At the Windows platform-specific level, when using C++ frameworks like ATL (or MFC), it makes sense to represent strings using CString (CStringW in Unicode builds, which should be the default in modern Windows C++ code).
On the other hand, in cross-platform C++ code, using std::string makes sense as well.
The same Unicode text can be encoded in UTF-16 when stored in CString(W), and in UTF-8 for std::string.
So, there’s a need to convert between those two Unicode representations. I discussed the details of such conversions in my MSDN Magazine article: “Unicode Encoding Conversions with STL Strings and Win32 APIs”. However, the C++ code associated to that article used std::wstring for UTF-16 strings.
I’ve created a new repository on GitHub, where I uploaded reusable code (in the form of a convenient header-only module) for converting between UTF-16 and UTF-8, using CStringW for UTF-16, and std::string for UTF-8. Please feel free to check it out!