1、LPTSTR/LPCTSTR两个别名
多字节字符集下:分别代表char*和constchar*(LPSTR和LPCSTR)
Unicode字符集下:分别代表wchar_t*和const char*
(LPWSTR和LPCWSTR)
TEXT宏可以将常量字符转换成LPWSTR/LPCWSTR
比如,LPWSTR/LPCWSTR s =TEXT("你好");
2、MessageBox宏
MessageBox是一个宏
多字节字符集下:代表的是
MessageBoxA(HWNDhWnd,LPCSTR lpText,LPCSTR lpCaption,UINTuType);
第一个参数是窗口句柄,第二个参数是消息内容,第三个参数是消息框标题,第四个参数是按钮类型。具体参照http://blog.csdn.net/selfref/article/details/4811790#comments
用法举例: MessageBoxA(hwnd, "NoEmpty Message!", "Error",1);
Unicode字符集下:代表的是
MessageBoxA(HWNDhWnd,LPCWSTR lpText,LPCWSTR lpCaption,UINTuType);
用法举例: MessageBoxW(hwnd, TEXT("NoEmpty Message!"), TEXT("Error"),1);
总结:
一般工程都选择unicode字符集,这时可以使用
MessageBox(hwnd,TEXT("NoEmpty Message!"),TEXT("Error"),1);
如果工程选择多字节字符集,这时可以使用
MessageBox(hwnd,"NoEmpty Message!","Error",1);
3、字符集出现矛盾的情况
在工程选择unicode字符集的情形下
比如socket编程里的send函数与win32的SendMessage宏函数
send(SOCKETs,constchar *buf,intlen,intflags);
给客户端发送消息,第二个参数需要char*类型的变量
故定义一个 char sendBuf[100];
再定义一个char tempBuf[100];
sprintf(tempBuf, "Server:%s", sendBuf);//将字符串格式化到tempBuf
SendMessage在unicode下代表的是SendMessageW
(HWNDhWnd,UINT Msg,WPARAM wParam,LPARAMlParam);
将发送的消息显示到一个聊天列表框listbox,比如
SendMessage(hShow, LB_ADDSTRING,0, (LPARAM)tempBuf);
这样虽然不会报错,但由于tempBuf是char*类型字符串,而unicode下SendMessage的第四个参数是需要LPWSTR类型的字符串,从而导致显示到列表框的内容都是乱码。
为了解决乱码问题,SendMessage这个宏函数不能使用了,只能选择SendMessageA这个函数了,比如 SendMessageA
(hShow, LB_ADDSTRING, 0, (LPARAM)tempBuf);这样就不会有乱码了。
4、_tcslen宏
_tcslen宏需要包含头文件tchar.h
多字节字符集下代表的是strlen,unicode下代表的是wcslen
char a[] = "你好";
cout << strlen(a) << endl;//4
cout << sizeof(a)<< endl;//5
strlen求的是字符数(中文字符算两个字符,不含\0)
sizeof求的是字节数(中文字符占两个字节,英文字符占一个字节)
wchar_t w[] = TEXT("你好a");
cout << wcslen(w) << endl;//3
cout << sizeof(w)<< endl;//8
控制台工程使用TEXT宏需要包含头文件windows.h
wcslen求的是字符数(中文字符算一个字符,不含\0)
sizeof求的是字节数(中文和英文字符都占两个字节)
另外补充string 或者 wstring的size() length()方法都是获取字符的个数,两个函数没区别