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
相关产品推荐
相关产品推荐

