您的位置:首页 > 编程语言 > C语言/C++

VS2005:C++ std::string, std::wstring转换方法

2008-11-06 11:35 495 查看
转自http://blog.csdn.net/ice197983/archive/2007/03/19/1533878.aspx



随着VS2003升级到VS2005,很多以前熟悉的输入输出方式以及参数传递方式都不再有效(参看 vs2003 到vs2005代码升级要点)。其中根字符串相关的内容是,wcout不再有效,默认参数传递方式由char*改成了wchar_t*等几个方面。为了解决上面的这些问题,这篇文章里,我将给出几种C++ std::string和std::wstring相互转换的转换方法。

第一种方法:调用WideCharToMultiByte()和MultiByteToWideChar(),代码如下(关于详细的解释,可以参考《windows核心编程》):




#include <string>


#include <windows.h>


using namespace std;


//Converting a WChar string to a Ansi string


std::string WChar2Ansi(LPCWSTR pwszSrc)




...{


int nLen = WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, NULL, 0, NULL, NULL);





if (nLen<= 0) return std::string("");





char* pszDst = new char[nLen];


if (NULL == pszDst) return std::string("");





WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, pszDst, nLen, NULL, NULL);


pszDst[nLen -1] = 0;





std::string strTemp(pszDst);


delete [] pszDst;





return strTemp;


}






string ws2s(wstring& inputws)




...{


return WChar2Ansi(inputws.c_str());


}



//Converting a Ansi string to WChar string




std::wstring Ansi2WChar(LPCSTR pszSrc, int nLen)







...{


int nSize = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pszSrc, nLen, 0, 0);


if(nSize <= 0) return NULL;





WCHAR *pwszDst = new WCHAR[nSize+1];


if( NULL == pwszDst) return NULL;





MultiByteToWideChar(CP_ACP, 0,(LPCSTR)pszSrc, nLen, pwszDst, nSize);


pwszDst[nSize] = 0;





if( pwszDst[0] == 0xFEFF) // skip Oxfeff


for(int i = 0; i < nSize; i ++)


pwszDst[i] = pwszDst[i+1];





wstring wcharString(pwszDst);


delete pwszDst;





return wcharString;


}





std::wstring s2ws(const string& s)




...{


return Ansi2WChar(s.c_str(),s.size());


}






第二种方法:采用ATL封装_bstr_t的过渡:(注,_bstr_是Microsoft Specific的,所以下面代码可以在VS2005通过,无移植性);
#include <string>
#include <comutil.h>
using namespace std;
#pragma comment(lib, "comsuppw.lib")

string ws2s(const wstring& ws);
wstring s2ws(const string& s);




string ws2s(const wstring& ws)




...{


_bstr_t t = ws.c_str();


char* pchar = (char*)t;


string result = pchar;


return result;


}





wstring s2ws(const string& s)




...{


_bstr_t t = s.c_str();


wchar_t* pwchar = (wchar_t*)t;


wstring result = pwchar;


return result;


}



第三种方法:使用CRT库的mbstowcs()函数和wcstombs()函数,平台无关,需设定locale。

#include <string>
#include <locale.h>
using namespace std;



string ws2s(const wstring& ws)




...{


string curLocale = setlocale(LC_ALL, NULL); // curLocale = "C";





setlocale(LC_ALL, "chs");





const wchar_t* _Source = ws.c_str();


size_t _Dsize = 2 * ws.size() + 1;


char *_Dest = new char[_Dsize];


memset(_Dest,0,_Dsize);


wcstombs(_Dest,_Source,_Dsize);


string result = _Dest;


delete []_Dest;





setlocale(LC_ALL, curLocale.c_str());





return result;


}





wstring s2ws(const string& s)




...{


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);


mbstowcs(_Dest,_Source,_Dsize);


wstring result = _Dest;


delete []_Dest;





setlocale(LC_ALL, "C");





return result;


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: