通过前一篇文章《C++中string,wstring,CString的基本概念和用法》,对Cstring、wstring 和string有了一个了解。string是C++提供的标准字符串操作类.wstring是操作宽字符串的类.。CString是对string(字符串)和wstring(宽字符串)的一个封装,常用在mfc中,用来解决编码问题的。在编程过程中,经常会遇到Cstring、wstring 和string之间的相互转换,在这里做了个简单地总结,另外也会附上其他类型的转换。常见的转换方式无非是三种:赋值转换、使用API函数转换、使用第三方库。
赋值方式:
//---------------------------------------------------------------------------
// wstring转化为string
//---------------------------------------------------------------------------
string ws2s(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;
}
//---------------------------------------------------------------------------
//将string 转换为wstring
//---------------------------------------------------------------------------
wstring s2ws( const std::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);
std::wstring result = _Dest;
delete []_Dest;
setlocale(LC_ALL, "C");
return result;
}
//----------------------------------------------------
// char *到string
//-----------------------------------------------------
string CharToString(char*arr,int count)
{
string result(arr,4);
return result;
}
//-------------------------------------------------------------
//string到char *
//-----------------------------------------------------------
//一个一个字符的赋值
char *p = new char[sring的长度+1];
p[string的长度]='\0';
//但是要注意最后赋值'\0'!!!
char * StringToChar(string &str)
{
int len=str.length();
char * p= new char[len+1];
for (int i=0;i<len;i++)
{
p[i]=str[i];
}
p[len]='\0';
}
//---------------------------------------------------------------------------
// CString到string
//---------------------------------------------------------------------------
//只需一个一个赋值即可!!
string CStringToString(CString cstr)
{
string result(cstr.GetLength(),'e');
for (int i=0;i<cstr.GetLength();i++)
{
result[i]=(char)cstr[i];
}
return result;
}
//---------------------------------------------------------------------------
// string到CString
//---------------------------------------------------------------------------
CString StringToCString(string str)
{
CString result;
for (int i=0;i<(int)str.length();i++)
{
result+=str[i];
}
return result;
}
//----------------------------------------------------------------------
// 将CString 转换为 TCHAR*
//----------------------------------------------------------------------
TCHAR* CString2TCHAR(CString &str)
{
int iLen = str.GetLength();
TCHAR* szRs = new TCHAR[iLen];
lstrcpy(szRs, str.GetBuffer(iLen));
str.ReleaseBuffer();
return szRs;
}
//----------------------------------------------------------------------
// 将TCHAR* 转换为 char*
//----------------------------------------------------------------------
char* THCAR2char(TCHAR* tchStr)
{
int iLen = 2*wcslen(tchStr);//CString,TCHAR汉字算一个字符,因此不用普通计算长度
char* chRtn = new char[iLen+1]
wcstombs(chRtn,tchStr,iLen+1);//转换成功返回为非负值
return chRtn;
}
//-----------------------------------------------------------------
// 将CString转换为 char*
//-----------------------------------------------------------------
char* CString2char(CString &str)
{
int len = str.GetLength();
char* chRtn = (char*)malloc((len*2+1)*sizeof(char));//CString的长度中汉字算一个长度
memset(chRtn, 0, 2*len+1);
USES_CONVERSION;
strcpy((LPSTR)chRtn,OLE2A(str.LockBuffer()));
return chRtn;
}
//----------------------------------------------------------------------
// 将CString(unicode)转换为char*(ANSI)
//----------------------------------------------------------------------
char* UCString2Nchar(const CString &s)
{
int nSize = 2*s.GetLength();
char *pAnsiString = new char[nSize+1];
wcstombs(pAnsiString, s, nSize+1);
return pAnsiString;
}
WideCharToMultiByte和MultiByteToWideChar
为了支持Unicode编码,需要多字节与宽字节之间的相互转换。WideCharToMultiByte和MultiByteToWideChar函数就是提供这种功能
#include <string>
//--------------------------------------------------------------------------------
//将 单字节char* 转换为 宽字节 wchar*
//-------------------------------------------------------------------------------
wchar_t* AnsiToUnicode( const char* szStr )
{
int nLen = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szStr, -1, NULL, 0 );
if (nLen == 0)
{
return NULL;
}
wchar_t* pResult = new wchar_t[nLen];
MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szStr, -1, pResult, nLen );
return pResult;
}
//-----------------------------------------------------------------------------
//将 宽字节 wchar* 转换为 单字节char*
//-----------------------------------------------------------------------------
void Ascii2WideString( const std::string& szStr, std::wstring& wszStr )
{
int nLength = MultiByteToWideChar( CP_ACP, 0, szStr.c_str(), -1, NULL, NULL );
wszStr.resize(nLength);
LPWSTR lpwszStr = new wchar_t[nLength];
MultiByteToWideChar( CP_ACP, 0, szStr.c_str(), -1, lpwszStr, nLength );
wszStr = lpwszStr;
delete [] lpwszStr;
}
使用第三方库
微软提供了一个工具,用于string和wstring之间的转换.
这个头文件中提供了一个utf8util 的命名空间,里面包含了如下的字符转换函数:
std::wstring UTF16FromUTF8(const std::string & utf8);
std::wstring UTF16FromUTF8(const char * utf8);
std::string UTF8FromUTF16(const std::wstring & utf16);
std::string UTF8FromUTF16(const wchar_t * utf16);
这个工具足够string与wstring之间的转换了.
其他:
string或者wstring转换到CString:
要把std::string或者std::wstring类型的数据存放到CString中,直接调用string::c_str()或者wstring::c_str()就行了.
CString转换到string或者wstring
CString::GetBuffer(0)就能转换到string或者wstring.如果编译时候定义了UNICODE,则转换到wstring;如果未定义,则转换到string.
string与wstring之间的转换
string,wstring转数字
需要使用stringstream,wstringstream(都在sstream头文件中包含)
int val;
string str;
stringstream ss (stringstream::in | stringstream::out);
ss << str;
ss >> val;
CString 转数字
_ttoi()这是个宏,如果定义了UNICODE,则等价于_wtoi(),否则对应atoi(),要使用,需要引入<stdlib.h>
数字转CString
int iValue = 0;
CString::Format(_T("%d") , iValue);