You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 15:52:08