本文最后更新于 160 天前,其中的信息可能已经有所发展或是发生改变。
CreateWindowEx 创建中文标签控件时看起来会“乱码”。宏函数默认映射到 CreateWindowExW,也就是 Unicode。
构建 GUI 时,我遇到了这个问题。假设我有一个按钮控件:
hBtnTest = CreateWindow(
"BUTTON", "我是中文",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
10, 120, 100, 30,
hWnd, NULL, hInst, NULL
);
实际编译出来的程序,“我是中文”是显示不出来的。以前从来没用过 C 语言写中文界面 GUI,这是我第一次碰到这个问题。搜索资料发现, CreateWindowEx 有两个方法,分别是 CreateWindowExA(ANSI)和 CreateWindowExW (Unicode)。若代码中使用多字节字符串(普通char*)传入 Unicode 版本 API,或宽字符(wchar_t*)传入 ANSI 版本 API,会导致编码解析错误,表现为中文乱码。
解决方案一:标识宽字符
不用改宏形式 API,动静较小。
字符串类型:使用wchar_t(宽字符类型)替代char,对应字符串指针为LPCWSTR(等价于const wchar_t*);
字符串前缀:所有中文(及其他)字符串前添加L前缀,标识为 Unicode 宽字符串
hBtnTest = CreateWindow(
L"BUTTON", L"我是中文",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
10, 120, 100, 30,
hWnd, NULL, hInst, NULL
);
解决方案二:编辑器编码保存为 GB 2312
对于小项目,这样改不用动源代码,让编译器自己去发力。如 Visual Studio Code,编辑器底部状态栏选中默认的 UTF-8。









