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個字符,由於一個漢字就是一個字符。