方法一: 需要调用 Windows 的 API 函数进行转换, 在 vs2017 上试验转换成功
- #ifdef _MSC_VER
- #include <Windows.h>
- #endif // _MSC_VER
- wstring strToStdWString(const string& str)
- {
- wstring wStr;
- int len = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str.c_str(), str.size(), NULL, 0);
- TCHAR* buffer = new TCHAR[len + 1];
- MultiByteToWideChar(CP_ACP, 0,(LPCSTR)str.c_str(), str.size(), buffer, len);
- buffer[len] = '\0';
- wStr.append(buffer);
- return wStr;
- }
方法二: 该方法经过测试输出错误, 并不能完成中文字符的转换
- wstring strToStdWString2(const string& str)
- {
- wstring wstr(str.length(), L' ');
- std::copy(str.begin(), str.end(), wstr.begin());
- return wstr;
- }
方法三: 该调用了 locale 头文件, 与平台无关
- #include <locale.h>
- wstring strToStdWString3(const string& s)
- {
- std::string curLocale = setlocale(LC_ALL, NULL);
- setlocale(LC_ALL, "chs");
- const char* _Source = s.c_str();
- size_t _Dsize = s.size() + 1;
- wchar_t* _Dest = new wchar_t[_Dsize];
- wmemset(_Dest, 0, _Dsize);
- size_t convertedChars = 0;
- mbstowcs_s(&convertedChars, _Dest,_Dsize, _Source, _TRUNCATE);
- std::wstring ws = _Dest;
- delete[] _Dest;
- setlocale(LC_ALL, curLocale.c_str());
- return ws;
- }
方法 4: 采用 ATL 封装_bstr_t 的过渡, 在 vs2017 上测试失败, 链接错误, 并无移植性
- #include <comutil.h>
- #pragma comment(lib, "comsuppw.lib")
- wstring strToWString4(const string& str)
- {
- _bstr_t t= str.c_str();
- wchar_t* pwchar = (wchar_t*)t;
- wstring ws = pwchar;
- return ws;
- }
总结: 使用方法一和方法三都能实现 string 向 wstring 的转换, 方法一调用了 Windows 的 API, 方法三需要设置 loacle
来源: http://www.bubuko.com/infodetail-3520218.html