轉一個一直困擾我的問題:Unicode下CString轉char* 用下面的辦法可以解決
一直覺得Unicode下的介面比較好看一些(MFC),所以一直都在Unicode環境下程式設計。
但是CString轉char一直是個困擾人的問題。
現在終於找到了解決辦法。
其實之所以弄了那麼久都沒有成功,還是源於自己的懶惰,捨不得真正花時間去尋找答案。
所以才會在每次程式設計,被這麼一個問題給絆住腳。
在此,希望每一個像我一樣懶惰的程式設計師能夠認識到不足。^-^
稍微廢話多了一點。原諒我,我只是想記錄一下此刻的心情。
以下給出解決辦法:
----------------------------------------------------------------------------------------------------------------------------------
1、Unicode下CString轉換為char *
方法一:使用API:WideCharToMultiByte進行轉換(我用的是這種方法)
CString str = _T("D://校內專案//QQ.bmp");
//注意:以下n和len的值大小不同,n是按字元計算的,len是按位元組計算的
int n = str.GetLength(); // n = 14, len = 18
//獲取寬位元組字元的大小,大小是按位元組計算的
int len = WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),NULL,0,NULL,NULL);
//為多位元組字元陣列申請空間,陣列大小為按位元組計算的寬位元組位元組大小
char * pFileName = new char[len+1]; //以位元組為單位
//寬位元組編碼轉換成多位元組編碼
WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),pFileName,len,NULL,NULL);
pFileName[len+1] = '/0'; //多位元組字元以'/0'結束
方法二:使用函式:T2A、W2A(沒試過。。想用的請自己驗證)
CString str = _T("D://校內專案//QQ.bmp");
//宣告識別符號
USES_CONVERSION;
//呼叫函式,T2A和W2A均支援ATL和MFC中的字元轉換
char * pFileName = T2A(str);
//char * pFileName = W2A(str); //也可實現轉換
注意:有時候可能還需要新增引用#include <afxpriv.h>
------------------------------------------------------------華麗的分割線-----------------------------------------------------------------------------------------------------------
另外附上多字符集下的CString和char間的相互轉化
(1) char*轉換成CString
若將char*轉換成CString,除了直接賦值外,還可使用CString::Format進行。例如:
char chArray[] = "Char test";
TCHAR * p = _T("Char test");( 或LPTSTR p = _T("Char test");)
CString theString = chArray;
theString.Format(_T("%s"), chArray);
theString = p;
(2) CString轉換成char*
若將CString類轉換成char*(LPSTR)型別,常常使用下列三種方法:
方法一,使用強制轉換。例如:
CString theString( (_T("Char test "));
LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;
方法二,使用strcpy。例如:
CString theString( (_T("Char test "));
LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
_tcscpy(lpsz, theString);
需要說明的是,strcpy(或可移值的_tcscpy)的第二個引數是 const wchar_t* (Unicode)或const char* (ANSI),系統編譯器將會自動對其進行轉換。
方法三,使用CString::GetBuffer。
如果你需要修改 CString 中的內容,它有一個特殊的方法可以使用,那就是 GetBuffer,它的作用是返回一個可寫的緩衝指標。 如果你只是打算修改字元或者截短字串,例如:
CString s(_T("Char test "));
LPTSTR p = s.GetBuffer();
LPTSTR dot = strchr(p, ''.'');
// 在這裡新增使用p的程式碼
if(p != NULL)
*p = _T('');
s.ReleaseBuffer(); // 使用完後及時釋放,以便能使用其它的CString成員函式
在 GetBuffer 和 ReleaseBuffer 之間這個範圍,一定不能使用你要操作的這個緩衝的 CString 物件的任何方法。因為ReleaseBuffer被呼叫之前,該 CString 物件的完整性得不到保障。
5.cstring 轉換為unsigned char *
BYTE *nf[4];
//char* nf[4];
//m_IPADD.GetAddress(nf0,nf1,nf2,nf3);
CString resToken;
int curPos= 0, count = 1;
resToken= m_IPAddr.Tokenize(".",curPos);
nf[0] = (BYTE*)(LPCTSTR)resToken;
----------------------------------------------------依然樸素而華麗-----------------------------------------------------------------------------------------
以上內容全部為網上轉載。具體出處已不明確。
未能標明出處,請大家原諒,請作者原諒。
--AmL.tu_s 2011.12.16