C++中Cstring、wstring 和string互相轉換總結


通過前一篇文章《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之間的轉換.

    utf8conv.h

    這個頭文件中提供了一個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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM