C # использует формат UTF16 для своих строк.
Таким образом, помимо простого преобразования типов, вы также должны учитывать фактический формат строки.
При компиляции для Многобайтовый набор символов Visual Studio и Win API предполагают UTF8 (собственно кодировка Windows, которая Windows-28591 ).
При компиляции для Набор символов Unicode Visual studio и Win API предполагают UTF16.
Итак, вы должны также преобразовать строку из формата UTF16 в формат UTF8, а не просто преобразовать ее в std :: string.
Это станет необходимым при работе с многосимвольными форматами, такими как некоторые нелатинские языки.
Идея состоит в том, чтобы решить, что std::wstring
всегда представляет UTF16 .
И std::string
всегда представляет UTF8 .
Это не обеспечивается компилятором, это скорее хорошая политика.
#include "stdafx.h"
#include <string>
#include <msclr\marshal_cppstd.h>
using namespace System;
int main(array<System::String ^> ^args)
{
System::String^ managedString = "test";
msclr::interop::marshal_context context;
//Actual format is UTF16, so represent as wstring
std::wstring utf16NativeString = context.marshal_as<std::wstring>(managedString);
//C++11 format converter
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convert;
//convert to UTF8 and std::string
std::string utf8NativeString = convert.to_bytes(utf16NativeString);
return 0;
}
Или используйте его в более компактном синтаксисе:
int main(array<System::String ^> ^args)
{
System::String^ managedString = "test";
msclr::interop::marshal_context context;
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convert;
std::string utf8NativeString = convert.to_bytes(context.marshal_as<std::wstring>(managedString));
return 0;
}