一、LPSTR LPCSTR LPTSTR LPCTSTR等
确定的类型:
LPSTR = CHAR * = char * LPCSTR = const CHAR * = char * //c意为const
不确定类型(可变型):
LPTSTR = LPWSTR = WCHAR * = wchar_t * //(Unicode编码) = LPSTR = CHAR * = char * //(多字节编码) TCHAR = wchar_t //Unicode编码 = char //多字节编码
二、CString与char *
- 多字节环境:CString等价于const char *,因此,在const char *的参数下可以直接使用CString,但是不能用于char *。
例:
void show(const char * name) { AfxMessageBox(name); } ......... CString name("luotian"); show(name); //可以通过
CString可以智能化
在多字节环境下无论怎么赋值都是ASCII编码,比如:CString a(L"luotian"),加上L修饰,CString依然将它进行ASCII编码。
在Unicode环境下,无论怎么赋值都是Unicode编码,比如:CString a("luotian"),不加L修饰依然可以通过。
-
CString与LPCTSTR
在函数参数需要LPTSTR,LPCTSTR等等时,CString变量可以直接使用.
//例如:在Unicode环境下: CString a("Luotian"); MessageBox(a);
-
CString->LPTSTR
//强制类型转换 CString a("Luotian"); LPTSTR p = (LPTSTR)(LPCTSTR)a; //用CString的GetBuffer()方法 LPTSTR p = a.GetBuffer();
-
LPTSTR->CString
可以直接赋值操作.
三、char * 与 wchar_t *的互换(重点)
-
ASCII->Unicode
LPSTR source ="Luotian";//源串 size_t len = strlen(source) + 1; size_t converted = 0; LPTSTR dest= (LPTSTR)malloc(len*sizeof(WCHAR)); mbstowcs_s(&converted,dest,len,source,_TRUNCATE);
- Unicode->ASCII
#define WChar2Char(lpWideCharStr,cbWideChar,lpMultiByteStr,cbMultiByte) WideCharToMultiByte(CP_ACP, 0, lpWideCharStr, cbWideChar, lpMultiByteStr, cbMultiByte, NULL, NULL)
例:
WChar2Char(source,-1,dest,cb字节数); TCHAR dest[256]; LPCWSTR source=L"Luotian"; WChar2Char(source, -1, dest, 256);
四、string和wstring
-
string->const char *(LPCSTR)和wstring->const wchar_t * (等价于LPCTSTR)
//采用.c_str()方法; string a("Luotian"); const char * p = a.c_str();
-
char * p->string
char * p = "luotian"; string a=p; //string和CString的一个区别在于:函数参数需要LPTSTR时,CString可以直接用,而string不行。