C# utiliza el formato UTF16 por sus cadenas.
Por lo tanto, además de convertir los tipos, también debe ser consciente del formato real de la cadena.
Al compilar para Conjunto de caracteres de varios bytes Visual Studio y la API de Windows asume UTF8 (En realidad, la codificación de Windows que es Windows-28591).
Al compilar para Conjunto de caracteres Unicode Visual Studio y la API de Windows asumen UTF16.
Por lo tanto, también debe convertir la cadena de UTF16 a formato UTF8, y no solo convertir a std :: string.
Esto será necesario cuando trabaje con formatos de caracteres múltiples, como algunos idiomas no latinos.
La idea es decidir que std::wstring
siempre representa UTF16.
Y std::string
siempre representa UTF8.
Esto no se aplica por el compilador, es más una buena política que tener.
#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;
}
o lo tiene en una sintaxis más compacta:
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;
}
¿Qué se necesita para funcionar? Incluye archivos, etc. ????? – alap
@alap, Use ** System :: Runtime :: InteropServices :: Marshal ** o write ** usando el espacio de nombres System :: Runtime :: InteropServices; **. – neo