wstring与string的转换
目录
wchar*
、wstring
和 char*
、std::string
的相互转换
字符串是基本内容,必须要掌握。
string
实质上是 char
字符的字符串。
typedef basic_string<char, char_traits<char>, allocator<char> > string;
wstring
实质上是 wchar_t
字符的字符串,即所谓的宽字符。
typedef basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > wstring;
同类型字符相互转换
string
字符串和 char
字符数组可以直接相互转换。
// char* -> string
char ch[] = "风中飞舞";
string str1(ch);
// string -> const char*
const char* pch = str1.c_str();
如果想转换到非常量形式 char*
,可以用 strcpy()
拷贝到新串,或用 const_cast<>
运算去掉常量性。
同理,wstring
和 wchar_t
数组的转换图上面相同,只不过拷贝串要用 wstrcpy()
函数。
不同类型字符相互转换
char
到 wchar_t
的转换有好几种,标准 C++ 用流函数 os.widen()
和 os.narrow()
可以转换单个字符。
下面用 Windows API 实现 unicode(一般情况下 wchar_t
使用的编码)和 ansi(char
使用的编码)的相互转换:
#include <windows.h>
#include <string>
// wchar_t* -> string
std::string wchar2string(const wchar_t* pwchar)
{
int nLen = WideCharToMultiByte(CP_ACP, 0, pwchar, -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, pwchar, -1, pszDst, nLen, NULL, NULL);
pszDst[nLen -1] = 0;
std::string strTemp(pszDst);
delete [] pszDst;
return strTemp;
}
// wstring -> string
std::string wstring2string(const std::wstring & wstr)
{
return wchar2string(wstr.c_str());
}
// char* -> wstring
std::wstring char2wstring( const char* pchar , int nLen)
{
int nSize = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pchar, nLen, 0, 0);
if(nSize <= 0)
return NULL;
WCHAR *pwszDst = new WCHAR[nSize+1];
if( NULL == pwszDst)
return NULL;
MultiByteToWideChar(CP_ACP, 0,(LPCSTR)pchar, nLen, pwszDst, nSize);
pwszDst[nSize] = 0;
if( pwszDst[0] == 0xFEFF) // skip Oxfeff
for(int i = 0; i < nSize; i ++)
pwszDst[i] = pwszDst[i+1];
std::wstring wcharString(pwszDst);
delete pwszDst;
return wcharString;
}
// string -> wstring
std::wstring string2wstring( const std::string & str )
{
return char2wstring(str.c_str(), str.size());
}
// char* -> wchar*
wchar_t* char2wchar( const char* pchar , int nLen)
{
int nSize = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pchar, nLen, 0, 0);
if(nSize <= 0)
return NULL;
WCHAR *pwszDst = new WCHAR[nSize+1];
if( NULL == pwszDst)
return NULL;
MultiByteToWideChar(CP_ACP, 0,(LPCSTR)pchar, nLen, pwszDst, nSize);
pwszDst[nSize] = 0; return pwszDst;
}
// wchar* -> char*
char* wchar2char( const wchar_t* pwchar )
{
int nLen = WideCharToMultiByte(CP_ACP, 0, pwchar, -1, NULL, 0, NULL, NULL);
if (nLen<= 0)
return 0;
char* pszDst = new char[nLen];
if (NULL == pszDst)
return 0;
WideCharToMultiByte(CP_ACP, 0, pwchar, -1, pszDst, nLen, NULL, NULL);
pszDst[nLen -1] = 0;
return pszDst;
}
以上的代码中有重复,应该进一步修改。