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

 
随着 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<= 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;
}

 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值