调用SendMessageTimeoutW发送WM_SETTEXT至记事本出现Unicode字符乱码求助
问题分析与修复方案
你遇到的乱码是因为编译器没有正确将源代码中的UTF-8字符转换为SendMessageTimeoutW所需的UTF-16宽字符串。当源文件保存为UTF-8但不带BOM时,MSVC默认会用系统默认ANSI编码解析宽字符串字面量(L""),导致越南语字符被错误转码,发送到记事本后显示为乱码。
修复方法
方法1:将源文件保存为UTF-8带BOM
在VS等IDE中可以直接修改文件编码:
- 点击「文件」→「高级保存选项」,选择「Unicode (UTF-8 带签名) - 代码页 65001」保存文件。
编译器会自动识别源文件编码,正确将L"xin chào bạn"转换为UTF-16宽字符串。
方法2:显式转换UTF-8字符串为UTF-16
如果不想修改文件编码,可先定义UTF-8字符串再转换为宽字符串:
// Handle = notepad // 定义UTF-8格式的字符串 std::string utf8_message = u8"xin chào bạn"; // 转换为UTF-16宽字符串 int wide_len = MultiByteToWideChar(CP_UTF8, 0, utf8_message.c_str(), -1, nullptr, 0); std::wstring message_to_send(wide_len, 0); MultiByteToWideChar(CP_UTF8, 0, utf8_message.c_str(), -1, &message_to_send[0], wide_len); // 发送消息 DWORD_PTR result; SendMessageTimeoutW(Handle, WM_SETTEXT, (WPARAM)0, (LPARAM)message_to_send.c_str(), SMTO_ABORTIFHUNG, 1000, &result);
方法3:添加编译器UTF-8编译选项
在VS项目中强制编译器按UTF-8解析源文件:
- 右键项目→「属性」→「C/C++」→「命令行」,在「附加选项」中添加
/utf-8。
添加后,L"xin chào bạn"会被正确解析为UTF-16宽字符串。
内容的提问来源于stack exchange,提问作者Nguyen Van Cao Ky
相关产品推荐
相关产品推荐

