由于多字节字符集的存在,为了保持对多字节字符集的兼容性,所以才有SetWindowTextA这样的函数存在。 多字节字符集也有它的好处,Unicode出现之前用的就是多字节字符集,现在还不能把多字节字符集彻底抹杀掉,还在用,所有要保持兼容。
[quote=引用 4 楼 BeanJoy 的回复:] 如2楼版主所说,windows api支持多字节和unicode。 实际windows在实现时,如果你调用的是多字节版本的api,则windows内部会先将相应的字符转换成unicode,然后再调用unicode版本的api。 比如你调用的是::SetWindowTextA(m_hwnd, "测试字符集ABC"),则windows会先将"测试字符集ABC"转换成unicode字符串,然后调用::SetWindowTextW。 你第二个问题是不行的。 多字节的显示是需要在某个代码页下而言的,一般我们用的简体中文的代码页为936,也就是我们常说的GBK。 在GBK环境中某个字符显示正常,那么拿到日文操作系统上,他们的代码页不为936,可能显示乱码。 UNICODE字符是最全的,包含了世界上所有的字符,代码中用UNICODE才能使你的程序无论在什么环境下都能显示正确。
SetWindowTextA(HWND hWnd,char* lpString) { wchar_t *pwsz = 转换(lpString); return SetWindowTextW(hWnd, pwsz); }
如2楼版主所说,windows api支持多字节和unicode。 实际windows在实现时,如果你调用的是多字节版本的api,则windows内部会先将相应的字符转换成unicode,然后再调用unicode版本的api。 比如你调用的是::SetWindowTextA(m_hwnd, "测试字符集ABC"),则windows会先将"测试字符集ABC"转换成unicode字符串,然后调用::SetWindowTextW。 你第二个问题是不行的。 多字节的显示是需要在某个代码页下而言的,一般我们用的简体中文的代码页为936,也就是我们常说的GBK。 在GBK环境中某个字符显示正常,那么拿到日文操作系统上,他们的代码页不为936,可能显示乱码。 UNICODE字符是最全的,包含了世界上所有的字符,代码中用UNICODE才能使你的程序无论在什么环境下都能显示正确。
简单来说SetWindowTextA内部的代码是这样的 SetWindowTextA(HWND hWnd,char* lpString) { wchar_t *pwsz = 转换(lpString); return SetWindowTextW(hWnd, pwsz); } 所以无论你用的是什么字符集,无论调用SetWindowTextA还是SetWindowTextW 最终将字符显示到窗口上的还是SetWindowTextW这个函数
16,472
社区成员
421,732
社区内容
加载中
VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌…… 向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能…… 我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……
试试用AI创作助手写篇文章吧