一. 问题
想问一下MessageBox
的原理,主要是关于字符方面的原理。
当我使用MessageBox
的时候,其内容和标题参数使用wchar_t
类型,可以正常显示中文;
当我使用wprintf
时,输出的就是几个问号,必须使用setlocale
将代码页设置为终端代码页才行。
注:
- 我知道
wprintf
是因为文件的字符集和终端的字符集不同导致的,所以我想问的是MessageBox
为什么能够正常显示中文,或者说更普遍的推广到所有Windows API函数为什么可以正常显示中文。- 下面两个程序文件的字符集都是Unicode
二. 代码和输出
1. wprintf
>> 未本地化
- 代码
#include <stdio.h>
#include <wchar.h>
int main(void)
{
wchar_t msg[] = L"你好,世界!";
wprintf(L"%s\n", msg);
return 0;
}
- 输出
>> 本地化后
- 代码
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main(void)
{
wchar_t msg[] = L"你好,世界!";
setlocale(LC_CTYPE, ".936");
wprintf(L"%s\n", msg);
return 0;
}
- 输出
2. MessageBox
- 代码
#ifndef UNICODE
#define UNICODE
#endif
#include <Windows.h>
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
wchar_t title[] = L"标题";
wchar_t msg[] = L"你好,Windows 11!";
MessageBox(NULL, msg, title, MB_OKCANCEL | MB_ICONASTERISK | MB_DEFBUTTON1 | MB_APPLMODAL | MB_TOPMOST);
return 0;
}
- 输出
三. 总结
可以看到,MessageBox
没有本地化操作,但是仍然能够正常显示中文,但是wprintf
却是需要本地化之后才能正常显示。
总之,问题还是上面那个,恳请各位能够指点一下!