LPCTSTR的含义:
L表示long指针, 这是为了兼容Windows 3.1等16位操作系统遗留下来的, 在win32中以及其他的32为操作系统中, long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。
P表示这是一个指针,C表示是一个常量T在Win32环境中, 有一个_T宏,这个宏用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。STR表示这个变量是一个字符串。
所以LPCTSTR就表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。同样, LPCSTR就只能是一个ANSI字符串,在程序中我们大部分时间要使用带T的类型定义。LPCTSTR == const TCHAR *
LP和P在win32中是等效的,都是指针的意思。
PTSTR的定义 typedef LPWSTR PTSTR, LPTSTR;
STR表示字符串。
问题就出在T上面。
T是一个宏,当没定义unicode时为空,定义unicode后表示为宽字符。
所以当定义unicode后,PTSTR转换为PSTR(LPSTR,一样意思)就不能直接转换了,因为一个是unicode,一个是ascii
结论:unicode下,PTSTR转换为PSTR是个编码转换问题。
编码转换可以用MS的函数完成。
WideCharToMultiByte将unicode转换成ascii
MultiByteToWideChar将ascii转换成unicode
运行环境:vc6
LPTSTR 转到string
LPTSTR lp="ddd";
string str=(string)lp;
string转成LPTSTR ,
string str="dddd";
LPTSTR lp=const_cast<char*>(str.c_str());
运行环境:vs2008 win 5.0 PPC
Wchar_t *转Cstring
wchar_t * ddd = L"ok";
CString dddd(ddd);
Wchar_t *(LPTSTR)转string
string WcharToString(wchar_t* temp)
{
char chars[MAX_PATH];
WideCharToMultiByte(CP_ACP,0,temp,-1,chars,MAX_PATH,NULL,NULL);
string str = (string)chars;
return str;
}
Int转CString
int i = 3;
CString dd;
dd.Format(L"%d",i);
CString转int
int i;
CString str = L"3";
i = _wtoi(str);
char*转CString(有乱码问题)
char* str = "char";
CString Cstr;
Cstr.Format(L"%s",str);
CString转string
char* pElementText;
int iTextLen;
iTextLen = WideCharToMultiByte(CP_ACP,0,errorTime,-1,NULL,0,NULL,NULL );
pElementText = new char[iTextLen + 1];
memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
WideCharToMultiByte( CP_ACP,0,errorTime,-1,pElementText,iTextLen,NULL,NULL );
string errorText = pElementText;
delete[] pElementText;
/*转换UTF-8编码为本地编码*/
string CMobileVideoApp::utfToAcp(string cstr)
{
int unicodeLen = MultiByteToWideChar( CP_UTF8,0,cstr.c_str(),-1,NULL,0);
wchar_t * pUnicode;
pUnicode = new wchar_t[unicodeLen+1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
MultiByteToWideChar( CP_UTF8,0,cstr.c_str(),-1,(LPWSTR)pUnicode,unicodeLen );
wstring rt;
rt = ( wchar_t* )pUnicode;
delete pUnicode;
char* pElementText;
int iTextLen;
iTextLen = WideCharToMultiByte(CP_ACP,0,rt.c_str(),-1,NULL,0,NULL,NULL );
pElementText = new char[iTextLen + 1];
memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
WideCharToMultiByte( CP_ACP,0,rt.c_str(),-1,pElementText,iTextLen,NULL,NULL );
string strText;
strText = pElementText;
delete[] pElementText;
return strText;
}