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

 

随着VS2003升级到VS2005,很多以前熟悉的输入输出方式以及参数传递方式都不再有效(参看 vs2003 vs2005代码升级要点)。其中根字符串相关的内容是,wcout不再有效,默认参数传递方式由char*改成了wchar_t*等几个方面。为了解决上面的这些问题,这篇文章里,我将给出几种C++ std::stringstd::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<= 0return 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, 00);
    
if(nSize <= 0return 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;
}

 
阅读更多
个人分类: VS2005
上一篇详细解说STL hash_map系列
下一篇C++的static关键字 详解
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭