通過前一篇文章《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);
