Unicode

LPTSTR、LPCSTR、LPSTR、LPCTSTR、LPWSTR、LPCWSTR:
 
 
L 表示long指針 這是爲了兼容Windows 3.1等16位操做系統遺留下來的,在win32中以及其餘的32位操做系統中, long指針和near指針及far修飾符都是爲了兼容的做用。沒有實際意義。
P 表示這是一個指針
C 表示是一個常量
T 表示在Win32環境中, 有一個_T宏
STR 表示這個變量是一個字符串
 
LPSTR:32-bit指針,指向一個字符串,每一個字符佔1字節char
LPCSTR: 32-bit指針,指向一個常字符串,每一個字符佔1字節char
LPTSTR::32-bit指針,每字符可能佔1字節或2字節,取決於Unicode是否認義  TCHAR
LPCTSTR::32-bit指針,指向一個常字符串,每字符可能佔1字節或2字節,取決於Unicode是否認義 TCHAR
LPWSTR:32-bit指針,每字符佔2字節,數據類型爲16位的wchar_t
LPCWSTR::32-bit指針,指向一個常字符串,每字符佔2字節,數據類型爲16位的wchar_t
 
Windows使用兩種字符集ANSI和UNICODE,前者就是一般使用的單字節方式,但這種方式處理象中文這樣的雙字節字符不方便,容易出現半個漢字的狀況。然後者是雙字節方式,方便處理雙字節字符。
 
MS推薦你使用相匹配的字符串函數,好比處理LPTSTR或者LPCTSTR 的時候,不要用strlen ,而是要用_tcslen,不然在UNICODE的編譯條件下,strlen不能處理 wchar_t*的字符串。
 
char*  是指向ANSI字符數組的指針,其中每一個字符佔據8位(有效數據是除掉最高位的其餘7位),這裏保持了與傳統的C,C++的兼容;
LP的含義是長指針(long   pointer),LPSTR是一個指向以‘\0’結尾的ANSI字符數組的指針,與char*能夠互換使用,在win32中較多地使用LPSTR。而LPCSTR中增長的‘C’的含義是「CONSTANT」(常量),代表這種數據類型的實例不能被使用它的API函數改變,除此以外,它與LPSTR是等同的。
 
數據類型轉換:
 
CString類中的字符就是被聲明爲TCHAR類型的,它提供了一個封裝好的類供用戶方便地使用。
 
可使用下面的ATL宏來進行,最好是將變量定義成TCHAR、LPTSTR等T類型,能夠避免轉換。

ATL宏介紹:html

     A2BSTR   OLE2A             T2A            W2A 
     A2COLE   OLE2BSTR    T2BSTR    W2BSTR 
     A2CT         OLE2CA         T2CA          W2CA 
     A2CW        OLE2CT         T2COLE    W2COLE 
     A2OLE       OLE2CW       T2CW         W2CT 
     A2T            OLE2T            T2OLE        W2OLE 
     A2W           OLE2W          T2W             W2T數據庫

 
    A :ANSI 字符串,也就是 MBCS。 
    W、OLE 寬字符串,也就是 UNICODE。 
    T 中間類型T。若是定義了 _UNICODE,則T表示W;若是定義了 _MBCS,則T表示A 
    C const 的縮寫
     利用這些宏,能夠快速的進行各類字符間的轉換。使用前必須包含頭文件,而且申明USER_CONVERSION;使用 ATL 轉換宏,因爲不用釋放臨時空間,因此使用起來很是方便。可是考慮到棧空間的尺寸(VC 默認2M),使用時要注意幾點:
    一、只適合於進行短字符串的轉換; 
    二、不要試圖在一個次數比較多的循環體內進行轉換; 
    三、不要試圖對字符型文件內容進行轉換,由於文件尺寸通常狀況下是比較大的; 
    四、對狀況 2 和 3,要使用 MultiByteToWideChar() 和 WideCharToMultiByte();
 
轉換示例:
 char name[10];
 TCHAR sex[5] ;
 char *p = name;
 TCHAR *pw = sex;
 LPSTR lpstr = name;
 LPCSTR lpcstr = name;
 lpcstr = lpstr;
 
 lpstr = p;
 p = (char*)sex;
 pw = (WCHAR*)name;
 LPWSTR lpwstr = (LPWSTR)lpstr;
 lpwstr = (LPWSTR)lpcstr;
 LPCWSTR lpcwstr = (LPCWSTR)lpstr;
 lpcwstr = (LPCWSTR)name;
 CString str(lpstr);
 CString str1(lpcstr);
 CString str2(lpwstr);
 CString str3(lpcwstr);
 CString str4(name);
 CString str5(sex);
 lpwstr = (LPWSTR)(LPCWSTR)str;
 lpstr = (LPSTR)(LPCWSTR)str;
 lpcstr = (LPCSTR)(LPCWSTR)str;
 p = (char*)str.GetBuffer();
 pw = str.GetBuffer();
 
CString轉換成LPSTR另外一種方式:
CString strFileName;
LPSTR lpStr = strFileName.GetBuffer();
strFileName.ReleaseBuffer();
 
在數據庫裏,有n前綴的字串類型就是UNICODE類型,這種類型中,固定用兩個字節來表示一個字符,不管這個字符是漢字仍是英文字母,或是別的什麼。 
若是你要測試"abc漢字"這個串的長度,在沒有n前綴的數據類型裏,這個字串是7個字符的長度,由於一個漢字至關於兩個字符。而在有n前綴的數據類型裏,一樣的測試串長度的函數將會告訴你是5個字符,由於一個漢字就是一個字符。
相關文章
相關標籤/搜索