1. 程式人生 > >轉一個一直困擾我的問題:Unicode下CString轉char* 用下面的辦法可以解決

轉一個一直困擾我的問題: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