Win32 C++程序向Edit编辑框设置中文文本显示乱码如何解决
问题根因
你的Unicode编译配置、SetWindowTextW和WM_SETTEXT的调用逻辑本身没有错误,乱码来自两个极易踩中的Win32开发新手坑:
- 源文件编码与编译器解析规则不匹配:代码里硬编码的
L"銷售回扣"属于宽字符字面量,如果.cpp源文件保存为无BOM的UTF-8、或者GBK本地编码,且编译器没有正确识别源文件编码时,会把中文字符错误转码为无效的wchar_t序列,最终传给控件的字符串本身就是损坏的,自然只能渲染出问号、乱码线条。 - Edit控件默认字体缺失中文支持:Win32原生Edit控件默认使用的系统字体在部分旧版Windows环境下,不会自动做中文字体回退,哪怕传入的字符串正确,没有匹配的字体也会把中文字符渲染成问号。
修复步骤
按顺序操作即可解决问题:
- 统一源文件编码
如果你用Visual Studio开发,打开对应cpp文件,通过顶部菜单「文件→高级保存选项」,将编码设置为Unicode (UTF-8 带签名) - 代码页65001后保存,重新编译。这一步可以解决绝大多数宽字符字面量乱码问题。
如果不方便修改文件编码,也可以直接在代码头添加MSVC编译指令,强制指定执行字符集:#pragma execution_character_set("utf-8") - 给Edit控件显式设置支持中文的字体
不要依赖控件默认字体,在创建完Edit控件句柄、调用SetWindowTextW之前,添加字体设置代码:
如果需要更稳定的中文渲染效果,可以手动创建中文字体设置给控件:// 方案1:用系统默认GUI字体,适配所有系统语言 HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); SendMessage(edit, WM_SETFONT, (WPARAM)hFont, TRUE);// 方案2:显式创建微软雅黑字体,简体中文场景把CHINESEBIG5_CHARSET替换为GB2312_CHARSET HFONT hFont = CreateFontW( 16, 0, 0, 0, FW_REGULAR, FALSE, FALSE, FALSE, CHINESEBIG5_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, DEFAULT_PITCH | FF_SWISS, L"Microsoft YaHei" ); SendMessage(edit, WM_SETFONT, (WPARAM)hFont, TRUE); // 注意:窗口销毁时需要调用DeleteObject(hFont)释放GDI资源,避免泄漏 - 重新编译运行即可正常显示中文。
补充说明
你之前尝试的SetWindowTextW调用、发送WM_SETTEXT消息两种写法本质完全等价,本身没有语法或调用错误,之前不生效和API调用方式无关,完全是字符串转码损坏、字体无法渲染字符导致的。
内容的提问来源于stack exchange,提问作者Tango
相关产品推荐
相关产品推荐

