C# utilizza il formato UTF16 per le sue corde.
Quindi, oltre alla semplice conversione dei tipi, è necessario essere consapevoli del formato effettivo della stringa.
Durante la compilazione per Set di caratteri multi-byte Visual Studio e l'API Win presuppongono UTF8 (In realtà la codifica di Windows che è Windows-28591).
Durante la compilazione per Set di caratteri Unicode Visual Studio e l'API Win assumono UTF16.
Quindi, è necessario convertire anche la stringa da UTF16 a UTF8 e non solo convertire in std :: string.
Questo diventerà necessario quando si lavora con formati a più caratteri come alcune lingue non latine.
L'idea è quella di decidere che std::wstring
sempre rappresenta UTF16.
E std::string
sempre rappresenta UTF8.
Questo non è applicato dal compilatore, è più una buona politica da avere.
#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 fa in una sintassi più compatta:
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;
}
fonte
2018-01-04 08:45:54
Cosa è necessario eseguire? Includi file ecc. ????? – alap
@alap, utilizzare ** System :: Runtime :: InteropServices :: Marshal ** o scrivere ** utilizzando lo spazio dei nomi System :: Runtime :: InteropServices; **. – neo