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

C++中格式化char转char16_t*出现乱码问题求助

解决char转char16_t*时的乱码问题

这个乱码问题我之前也碰到过,核心原因是字符编码不匹配:char通常对应单字节的ASCII或UTF-8编码,而char16_t是双字节的UTF-16编码。直接强制类型转换只是粗暴地把内存里的单字节数据当成UTF-16解析,完全没有做编码转换,自然会出现乱码。

下面给你两种靠谱的解决方案,根据你的项目环境选就行:

方案一:用C++标准库实现跨平台转换

如果你的项目需要跨平台,优先用C++标准库的std::wstring_convert来做编码转换,它能把UTF-8/ASCII的char字符串转成UTF-16的char16_t字符串:

#include <codecvt>
#include <string>

// 先保留你原来的格式化逻辑
char msg[12];
sprintf_s(msg, 12, "-%dHP", txt->damage);

// 初始化编码转换器(UTF-8转UTF-16)
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> converter;
// 把char字符串转成UTF-16的u16string
std::u16string u16_msg = converter.from_bytes(msg);

// 直接传递u16string的c_str()给Print函数
Interfaces::CenterPrint()->Print(u16_msg.c_str());

方案二:Windows平台用系统API转换

如果你的项目只在Windows上运行,也可以用系统自带的MultiByteToWideCharAPI(Windows里的wchar_t本质就是UTF-16,和char16_t内存布局兼容):

#include <windows.h>

char msg[12];
sprintf_s(msg, 12, "-%dHP", txt->damage);

// 第一步:计算需要的UTF-16缓冲区大小
int buffer_len = MultiByteToWideChar(CP_ACP, 0, msg, -1, nullptr, 0);
if (buffer_len == 0) {
    // 这里可以加错误处理,比如调用GetLastError()查看原因
    return;
}

// 第二步:分配UTF-16缓冲区
char16_t* u16_msg = new char16_t[buffer_len];
// 执行编码转换
MultiByteToWideChar(CP_ACP, 0, msg, -1, reinterpret_cast<wchar_t*>(u16_msg), buffer_len);

// 调用Print函数
Interfaces::CenterPrint()->Print(u16_msg);

// 记得用完释放内存,避免泄漏
delete[] u16_msg;

额外注意事项

  • 绝对不要直接强转指针!这种做法属于未定义行为,只是内存的强制 reinterpret,完全不是真正的编码转换。
  • 如果你的项目源码用的是UTF-8编码,MultiByteToWideChar的第一个参数要改成CP_UTF8,而不是CP_ACP(CP_ACP对应系统默认的ANSI编码)。
  • 标准库方案更适合跨平台场景,Windows API方案则更贴合Windows生态的底层调用。

内容的提问来源于stack exchange,提问作者Janek Aldo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:28:02