1. 程式人生 > >CString、TCHAR*、char*轉換

CString、TCHAR*、char*轉換

1.標頭檔案中要定義巨集;  
      #define   UNICODE  
      #define   _UNICODE   
  ////////////////////

char   buf[128];  
  memset(buf,0,128);  
  strcpy(buf,"你好");  
  WCHAR   pCName[128];  
  memset(pCName,0,128);  
  MultiByteToWideChar(CP_THREAD_ACP,MB_USEGLYPHCHARS,buf,strlen(buf),pCName,128);   
   至於WCHAR   轉換到CHAR,則用  
  WideCharToMultiByte

//////////////////////////


  2.char轉換成wchar
  
      const   char   *pFilePathName   =   "c://aa.dll";  
      int   nLen   =   strlen(pFilePathName)   +   1;  
      int   nwLen   =   MultiByteToWideChar(CP_ACP,   0,   pFilePathName,  
nLen,   NULL,   0);  
   
      TCHAR   lpszFile[256];  
      MultiByteToWideChar(CP_ACP,   0,   pFilePathName,   nLen,   lpszFile,  
nwLen);  
   
  3.wchar轉換成char

  
        char   *pFilePathName;  
        TCHAR   lpszFile[256];  
      _tcscpy(lpszFile,   _T("c://aa.dll"));  
   
      int   nLen   =   wcslen(wstr)+1;    
      WideCharToMultiByte(CP_ACP,   0,   lpszFile,   nLen,   pFilePathName,  
2*nLen,   NULL,   NULL);
  

char*和CString轉換
CString 是一種很特殊的 C++ 物件,它裡面包含了三個值:一個指向某個資料緩衝區的指標、一個是該緩衝中有效的字元記數(它是不可存取的,是位於
CString 地址之下的一個隱藏區域)以及一個緩衝區長度。
有效字元數的大小可以是從0到該緩衝最大長度值減1之間的任何數(因為字串結尾有一個NULL字元)。字元記數和緩衝區長度被巧妙隱藏。

(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('/0');
         s.ReleaseBuffer();                     // 使用完後及時釋放,以便能使用其它的CString成員函式
         在 GetBuffer 和 ReleaseBuffer 之間這個範圍,一定不能使用你要操作的這個緩衝的 CString 物件的任何方法。因為
ReleaseBuffer 被呼叫之前,該 CString 物件的完整性得不到保障。

CString ,BSTR ,LPCTSTR之間關係和區別

CString是一個動態TCHAR陣列,BSTR是一種專有格式的字串(需要用系統提供的函式來操縱,LPCTSTR只是一個常量的TCHAR指標。

                              CString 是一個完全獨立的類,動態的TCHAR陣列,封裝了 + 等操作符和字串操作方法。
                              typedef OLECHAR FAR* BSTR;
                              typedef const char * LPCTSTR;

                              vc++中各種字串的表示法
                              首先char*
                              是指向ANSI字元陣列的指標,其中每個字元佔據8位(有效資料是除掉最高位的其他7位),這裡保持了與傳統的C,C++的相容。
                              LP的含義是長指標(long
                              pointer)。LPSTR是一個指向以‘/0’結尾的ANSI字元陣列的指標,與char*可以互換使用,在win32中較多地使用LPSTR。
                              而LPCSTR中增加的‘C’的含義是“CONSTANT”(常量),表明這種資料型別的例項不能被使用它的API函式改變,除此之外,它與LPSTR是等同的。
                              1.LP表示長指標,在win16下有長指標(LP)和短指標(P)的區別,而在win32下是沒有區別的,都是32位.所以這裡的LP和P是等價的.
                              2.C表示const
                              3.T是什麼東西呢,我們知道TCHAR在採用Unicode方式編譯時是wchar_t,在普通時編譯成char.
                              為了滿足程式程式碼國際化的需要,業界推出了Unicode標準,它提供了一種簡單和一致的表達字串的方法,所有字元中的位元組都是16位的值,其數量也可以滿足差不多世界上所有書面語言字元的編碼需求,開發程式時使用Unicode(型別為wchar_t)是一種被鼓勵的做法。
                              LPWSTR與LPCWSTR由此產生,它們的含義類似於LPSTR與LPCSTR,只是字元資料是16位的wchar_t而不是char。
                              然後為了實現兩種編碼的通用,提出了TCHAR的定義:
                              如果定義_UNICODE,宣告如下:
                              typedef wchar_t TCHAR;
                              如果沒有定義_UNICODE,則宣告如下:
                              typedef char TCHAR;
                              LPTSTR和LPCTSTR中的含義就是每個字元是這樣的TCHAR。
                              CString類中的字元就是被宣告為TCHAR型別的,它提供了一個封裝好的類供使用者方便地使用。
                              LPCTSTR:
                                   #ifdef _UNICODE
                                      typedef const wchar_t * LPCTSTR;
                                   #else
                                      typedef const char * LPCTSTR;
                                   #endif
                              VC常用資料型別使用轉換詳解
                              
                              先定義一些常見型別變數藉以說明
                              int i = 100;
                              long l = 2001;
                              float f=300.2;
                              double d=12345.119;
                              char username[]="女俠程佩君";
                              char temp[200];
                              char *buf;
                              CString str;
                              _variant_t v1;
                              _bstr_t v2;
                 一、其它資料型別轉換為字串
                              短整型(int)
                                     itoa(i,temp,10);    
                              //將i轉換為字串放入temp中,最後一個數字表示十進位制
                                     itoa(i,temp,2);      //按二進位制方式轉換
                              長整型(long)
                                     ltoa(l,temp,10);

                              C提供了sprintf作為通用解決方案,可以把sprintf看成atol和atof的反函式

                                     sprintf(string,"%d",number); //long型用"%ld",浮點型用"%f";

                 二、從其它包含字串的變數中獲取指向該字串的指標
                              CString變數
                              str = "2008北京奧運";
                              buf = (LPSTR)(LPCTSTR)str;
                              BSTR型別的_variant_t變數
                              v1 = (_bstr_t)"程式設計師";
                              buf = _com_util::ConvertBSTRToString((_bstr_t)v1);
                 三、字串轉換為其它資料型別
                              strcpy(temp,"123");
                              短整型(int)
                                    i = atoi(temp);
                              長整型(long)
                                    l = atol(temp);
                              浮點(double)
                                    d = atof(temp);
                   四、其它資料型別轉換到CString
                              使用CString的成員函式Format來轉換,例如:
                              整數(int)
                                    str.Format("%d",i);
                              浮點數(float)
                                    str.Format("%f",i);
                              字串指標(char *)等已經被CString建構函式支援的資料型別可以直接賦值
                                    str = username;
                      五、BSTR、_bstr_t與CComBSTR
                              CComBSTR、_bstr_t是對BSTR的封裝,BSTR是指向字串的32位指標。
                              char *轉換到BSTR可以這樣: BSTR
                              b=_com_util::ConvertStringToBSTR("資料");    
                              //使用前需要加上標頭檔案comutil.h
                              反之可以使用char *p=_com_util::ConvertBSTRToString(b);

                        六、VARIANT 、_variant_t 與 COleVariant
                              VARIANT的結構可以參考標頭檔案VC98/Include/OAIDL.H中關於結構體tagVARIANT的定義。
                              對於VARIANT變數的賦值:首先給vt成員賦值,指明資料型別,再對聯合結構中相同資料型別的變數賦值,舉個例子:
                              VARIANT va;
                              int a=2001;
                              va.vt=VT_I4;    //指明整型資料
                              va.lVal=a;      //賦值
                              對於不馬上賦值的VARIANT,最好先用Void VariantInit(VARIANTARG
                              FAR*
                              pvarg);進行初始化,其本質是將vt設定為VT_EMPTY,下表我們列舉vt與常用資料的對應關係:
                              unsigned char bVal; VT_UI1
                              short iVal; VT_I2
                              long lVal;  VT_I4 
                              float fltVal;  VT_R4
                              double dblVal;  VT_R8 
                              VARIANT_BOOL boolVal;  VT_BOOL
                              SCODE scode;  VT_ERROR
                              CY cyVal;  VT_CY
                              DATE date;  VT_DATE
                              BSTR bstrVal;  VT_BSTR
                              IUnknown FAR* punkVal;  VT_UNKNOWN
                              IDispatch FAR* pdispVal;  VT_DISPATCH
                              SAFEARRAY FAR* parray;  VT_ARRAY|*
                              unsigned char FAR* pbVal;  VT_BYREF|VT_UI1
                              short FAR* piVal;  VT_BYREF|VT_I2
                              long FAR* plVal;  VT_BYREF|VT_I4
                              float FAR* pfltVal;  VT_BYREF|VT_R4
                              double FAR* pdblVal; VT_BYREF|VT_R8
                              VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOL
                              SCODE FAR* pscode;  VT_BYREF|VT_ERROR
                              CY FAR* pcyVal;  VT_BYREF|VT_CY
                              DATE FAR* pdate; VT_BYREF|VT_DATE
                              BSTR FAR* pbstrVal;  VT_BYREF|VT_BSTR
                              IUnknown FAR* FAR* ppunkVal;  VT_BYREF|VT_UNKNOWN
                              IDispatch FAR* FAR* ppdispVal;
                              VT_BYREF|VT_DISPATCH
                              SAFEARRAY FAR* FAR* pparray;  VT_ARRAY|*
                              VARIANT FAR* pvarVal;  VT_BYREF|VT_VARIANT
                              void FAR* byref;  VT_BYREF
                              _variant_t是VARIANT的封裝類,其賦值可以使用強制型別轉換,其建構函式會自動處理這些資料型別。
                              例如:
                              long l=222;
                              ing i=100;
                              _variant_t lVal(l);
                              lVal = (long)i;
                              COleVariant的使用與_variant_t的方法基本一樣,請參考如下例子:
                              COleVariant v3 = "字串", v4 = (long)1999;
                              CString str =(BSTR)v3.pbstrVal;
                              long i = v4.lVal;