c++ 使用封送上下文将托管字符串转换为std:string

ewm0tg9j  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(144)

我知道的职位: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只有一个chara

fjaof16o

fjaof16o1#

std::stringchar的序列。char通常只能容纳ascii字符(8位)。当分配的unicode字符值超过8位时,它可能会溢出。溢出时,您会得到一个“垃圾”值。
您需要std::wstring,它包含一个wchat_t序列来表示unicode字符串。
因此,将最后两行更改为:

//-------------------------------------vvvvvvv--------
auto constChars = ctx.marshal_as<const wchar_t*>(str);

//---vvvvvvv----------------------
std::wstring myString(constChars);

相关问题