This is in reference to the most up-voted answer but I don't have enough "reputation" to just comment directly on the answer.
The name of the function in the solution "wstring_from_bytes" implies it is doing what the original poster wants, which is to get a wstring given a string, but the function is actually doing the opposite of what the original poster asked for and would more accurately be named "bytes_from_wstring".
To convert from string to wstring, the wstring_from_bytes function should use mbstowcs not wcstombs
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstdlib> #include <string> std::wstring wstring_from_bytes(std::string const& str) { size_t requiredSize = 0; std::wstring answer; wchar_t *pWTempString = NULL; /* * Call the conversion function without the output buffer to get the required size * - Add one to leave room for the NULL terminator */ requiredSize = mbstowcs(NULL, str.c_str(), 0) + 1; /* Allocate the output string (Add one to leave room for the NULL terminator) */ pWTempString = (wchar_t *)malloc( requiredSize * sizeof( wchar_t )); if (pWTempString == NULL) { printf("Memory allocation failure.\n"); } else { // Call the conversion function with the output buffer size_t size = mbstowcs( pWTempString, str.c_str(), requiredSize); if (size == (size_t) (-1)) { printf("Couldn't convert string\n"); } else { answer = pWTempString; } } if (pWTempString != NULL) { delete[] pWTempString; } return answer; } int main() { std::string str = "abcd"; std::wstring wstr = wstring_from_bytes(str); }
Regardless, this is much more easily done in newer versions of the standard library (C++ 11 and newer)
#include <locale> #include <codecvt> #include <string> std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter; std::wstring wide = converter.from_bytes(narrow_utf8_source_string);
string? Usually either ISO/IEC 8859-1 (Which many incorrectly call "ASCII") or UTF-8.