C ++ - char到char16_t *

时间:2018-03-28 09:34:08

标签: c++ winapi format

我试图将格式化的char转换为char16_t *

我目前正在这样做,但它会产生随机的特征:

char msg[12];
sprintf_s(msg, 12, "-%dHP", txt->damage);
Interfaces::CenterPrint()->Print((char16_t*)msg);

感谢您的帮助

1 个答案:

答案 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_convertchar[]数据转换为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());