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