win32API字符集问题

来源:互联网 发布:淘宝vr购物在哪里打开 编辑:程序博客网 时间:2024/05/17 12:24

1、LPTSTR/LPCTSTR两个别名

多字节字符集下:分别代表char*和constchar*(LPSTRLPCSTR

Unicode字符集下:分别代表wchar_t*和const char*

LPWSTRLPCWSTR

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

 

SendMessageunicode下代表的是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()方法都是获取字符的个数,两个函数没区别

0 0