C++中SetWindowTextW, SetWindowTextA SetWindowText三者有啥区别?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中SetWindowTextW, SetWindowTextA SetWindowText三者有啥区别?相关的知识,希望对你有一定的参考价值。

SetWindowTextW表示设置的字符串是WCHAR (双字节字符 )
SetWindowTextA表示设置的字符串是CHAR (单字节字符 )
SetWindowText表示设置的字符串是自动匹配当前项目的字符环境是单字节还是双字节字符
参考技术A #ifdef UNICODE
#define SetWindowText  SetWindowTextW
#else
#define SetWindowText  SetWindowTextA
#endif // !UNICODE

首先解释A和W的不同意义:

其实MFC中

凡是涉及字符串处理的API函数都有A和W两个版本

A结尾的表示使用ANSI编码:中文的Windows操作系统一般对应的就是GBK,GBK在内存里英文占用一个字节 、汉字两个字节。 

W结尾的表示:

UTF-16版本---英文两个字节、汉字两个字节 

UTF-32版本---英文四个字节、汉字四个字节

如果楼主确定你的软件将来只需要英文或汉文字符,那就选择A版本的API,如果有可能要使用多国文字,那么最好使用W版本的API。

然后,楼主再看上面一段,MFC中的源代码,其实实际上只存在SetWindowTextW和SetWindowTextA,如果你的整个项目字符集是UNICODE格式的字符集,那SetWindowText和SetWindowTextW其实就是一个东西,如果不是UNICODE那SetWindowText就和SetWindowTextA是一个东西。

无法使用Unicode特殊字符设置窗口文本

我正在尝试使用下面指定的unicode特殊字符按代码设置对话框项目文本:

https://www.fileformat.info/info/unicode/char/1f310/index.htm

我一直在尝试调用SetWindowTextW函数传递UTF-16(十六进制)值作为参数而没有成功:

GetDlgItem(IDSETTINGS)->SetWindowTextW(_T("uD83CuDF10"));

当我构建我的解决方案时,我遇到两个错误:

错误C3850:' uD83C'amon -character-.name指定无效字符

错误C3850:' uDF10'是universal-character-.name指定无效字符

我会感激任何帮助。

答案

在这种情况下,编译器错误C3850的原因可以在reference(强调我的)中找到:

表示为通用字符名称的字符必须表示0-10FFFF范围内的有效Unicode代码点。通用字符名称不能包含Unicode代理项范围,D800-DFFF或编码代理项对中的值。编译器自动从有效代码点生成代理项对。

使用UTF-32代码点对我有用:

GetDlgItem( IDSETTINGS )->SetWindowTextW( L"U0001F310" );

如果确保源文件以Unicode编码存储,您还可以将字符存储在源文件中,我建议使用带有BOM的UTF-8。

GetDlgItem( IDSETTINGS )->SetWindowTextW( L"

以上是关于C++中SetWindowTextW, SetWindowTextA SetWindowText三者有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

mfc中SetWindowTextW

C++ 编译时提示:不能将参数 1 从“char [6]”转换为“LPCTSTR”

想用MFC下的SetWindowTextW给编辑框输出数值类型的变量,求教

无法使用Unicode特殊字符设置窗口文本

从按钮单击返回值

MFC 静态文本框