我在 C++ 中有一个函数,该函数具有 std::string 类型的值,并希望将其转换为 String^。
void(String ^outValue)
{
std::string str("Hello World");
outValue = str;
}
我在 C++ 中有一个函数,该函数具有 std::string 类型的值,并希望将其转换为 String^。
void(String ^outValue)
{
std::string str("Hello World");
outValue = str;
}
谷歌搜索显示marshal_as(未经测试):
// marshal_as_test.cpp
// compile with: /clr
#include <stdlib.h>
#include <string>
#include <msclr\marshal_cppstd.h>
using namespace System;
using namespace msclr::interop;
int main() {
std::string message = "Test String to Marshal";
String^ result;
result = marshal_as<String^>( message );
return 0;
}
另请参阅编组概述。
来自 MSDN:
#include <string>
#include <iostream>
using namespace System;
using namespace std;
int main() {
string str = "test";
String^ newSystemString = gcnew String(str.c_str());
}
据我所知,至少 marshal_as 方法(不确定 gcnew 字符串)会导致 std::string 中的非 ASCII UTF-8 字符被破坏。
根据我在https://bytes.com/topic/c-sharp/answers/725734-utf-8-std-string-system-string上找到的内容,我构建了这个似乎对我有用的解决方案最少使用德语变音符号:
System::String^ StdStringToUTF16(std::string s)
{
cli::array<System::Byte>^ a = gcnew cli::array<System::Byte>(s.length());
int i = s.length();
while (i-- > 0)
{
a[i] = s[i];
}
return System::Text::Encoding::UTF8->GetString(a);
}