我知道的职位:Converting managed System::String to std::string in C++/CLI进行所需的转换。但是我遇到了下面的代码,它使用marshal_context
代替。我试图了解它是如何工作的。
// required header : #include <msclr/marshal.h>
System::String^ str = gcnew System::String(L"\u0105");
msclr::interop::marshal_context ctx;
auto constChars = ctx.marshal_as<const char*>(str);
std::string myString(constChars);
如果我没记错的话,str
是一个使用UTF-16表示的16位“字符”,根据Unicode list,它是一个带有一个ogonek的小拉丁字母a
,但myString
最终是一个字符?
,这种转换是如何发生的?
此外,当用ASCII字符(例如a
)创建str
时,代码为什么会按“预期”工作?在UTF-16中,a
将用16位表示,最高/最低(取决于字节序)有效的8位都是0
。那么,为什么myString
只有一个char
a
?
1条答案
按热度按时间fjaof16o1#
std::string
是char
的序列。char
通常只能容纳ascii字符(8位)。当分配的unicode字符值超过8位时,它可能会溢出。溢出时,您会得到一个“垃圾”值。您需要
std::wstring
,它包含一个wchat_t
序列来表示unicode字符串。因此,将最后两行更改为: