关于string转换为wstring问题

方法一:需要调用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;
}

  

方法二:该方法经过测试输出错误,并不能完成中文字符的转换

1 wstring strToStdWString2(const string& str)
2 {
3     wstring wstr(str.length(), L' ');
4     std::copy(str.begin(), str.end(), wstr.begin());
5     return wstr;
6 }

方法三:该调用了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

posted @ 2020-04-24 14:53  `野百合的春天  阅读(965)  评论(0编辑  收藏  举报