宽字符和窄字符的转换需求很经常会遇到,今天从网上找了两个函数,修改了一下,奉献给大家。

#include <string>
#include <assert.h>

std::wstring toWideString( const char* pStr,int len)
{
assert(pStr) ;
assert(len >= 0 || len == -1, _T("Invalid string length: ") << len ) ;

// figure out how many wide characters we are going to get
int nChars = MultiByteToWideChar( CP_ACP , 0 , pStr , len , NULL , 0 ) ;
if ( len == -1 )
-- nChars ;
if ( nChars == 0 )
return L"" ;

// convert the narrow string to a wide string
// nb: slightly naughty to write directly into the string like this
std::wstring buf;
buf.resize(nChars);
::MultiByteToWideChar(CP_ACP,0,pStr,len,const_cast<wchar_t*>(buf.c_str()),nChars);

return buf ;
}

std::wstring toWideString(const std::string& strA)
{
const char* pStr = strA.c_str();
int len = strA.length();
return toWideString(pStr,len);
}

std::string toNarrowString( const wchar_t* pStr,int len)
{
// figure out how many narrow characters we are going to get
assert(pStr) ;
assert(len >= 0 || len == -1 , _T("Invalid string length: ") << len ) ;

int nChars = WideCharToMultiByte( CP_ACP , 0 ,
pStr , len , NULL , 0 , NULL , NULL ) ;
if ( len == -1 )
-- nChars ;
if ( nChars == 0 )
return "" ;

// convert the wide string to a narrow string
// nb: slightly naughty to write directly into the string like this
std::string buf ;
buf.resize(nChars);
WideCharToMultiByte(CP_ACP,0,pStr,len,const_cast<char*>(buf.c_str()),nChars,NULL,NULL);

return buf ;
}

std::string toNarrowString(const std::wstring& strW)
{
const wchar_t* pStr = strW.c_str();
int len = strW.length();
return toNarrowString(pStr,len);
}


      有问题或者更好意见的话请联系我。