我试图将格式化的char转换为char16_t *
我目前正在这样做,但它会产生随机的特征:
char msg[12];
sprintf_s(msg, 12, "-%dHP", txt->damage);
Interfaces::CenterPrint()->Print((char16_t*)msg);
感谢您的帮助
答案 0 :(得分:0)
您不能像往常一样将char[]
类型转换为char16_t*
。 char
的大小为1个字节,但char16_t
的大小为2个字节。当读作char
数据时,char16_t
数据不会被正确解释。
在Windows上,wchar_t
的大小也是2个字节。您可以将数据格式化为wchar_t[]
缓冲区,然后将其输入到char16_t
:
wchar_t msg[14];
swprintf_s(msg, 14, L"-%dHP", txt->damage);
Interfaces::CenterPrint()->Print(reinterpret_cast<char16_t*>(msg));
可替换地:
char16_t msg[14];
swprintf_s(reinterpret_cast<wchar_t*>(msg), 14, L"-%dHP", txt->damage);
Interfaces::CenterPrint()->Print(msg);
但是,这是高度特定于平台的。在许多平台上,wchar_t
的大小为4个字节。
由于您的消息文本仅包含ASCII字符,因此更安全且可移植的解决方案是创建一个单独的char_t[]
缓冲区,其中包含每个char
的副本:
char msg[14];
sprintf_s(msg, 14, "-%dHP", txt->damage);
char16_t msg2[14];
std::copy(msg, msg+14, msg2);
// or:
// std::transform(msg, msg+14, msg2, [](char c){ return (char16_t)c; });
Interfaces::CenterPrint()->Print(msg2);
或者,您可以使用std::wstring_convert
将char[]
数据转换为std::u16string
:
char msg[14];
int len = sprintf_s(msg, 14, "-%dHP", txt->damage);
std::wstring_convert<std::codecvt<char16_t, char, std::mbstate_t>, char16_t> conv16;
std::u16string strMsg = conv16.from_bytes(msg, msg+len);
Interfaces::CenterPrint()->Print(strMsg.c_str());
或者,您可以使用std::basic_ostringstream<char16_t>
直接创建std::u16string
,而根本不使用char[]
:
std::basic_ostringstream<char16_t> msg;
msg << u"-" << txt->damage << u"HP";
std::u16string strMsg = msg.str();
Interfaces::CenterPrint()->Print(strMsg.c_str());