C++/CLI Conversion à partir de System::String^ à std::string
Quelqu'un peut s'il vous plaît poster un code simple qui permettrait de convertir,
System::String^
À,
C++ std::string
I. e., Je veux juste assigner la valeur d',
String^ originalString;
À,
std::string newString;
Vous devez vous connecter pour publier un commentaire.
Découvrez
System::Runtime::InteropServices::Marshal::StringToCoTaskMemUni()
et de ses amis.Désolé ne peut pas afficher le code maintenant; je n'ai pas de VS sur cette machine pour vérifier qu'il compile avant de poster.
Ne roulent pas vos propres, l'utilisation ces à portée de main (et extensible) wrappers fourni par Microsoft.
Par exemple:
Vous pouvez facilement le faire comme suit
Cela a fonctionné pour moi:
Voici quelques routines de conversion que j'ai écrit il y a plusieurs années pour un c++/cli projet, ils devrait encore du travail.
J'ai passé des heures à essayer de convertir un formulaire windows listbox ToString de la valeur à une norme de chaîne pour que je puisse l'utiliser avec fstream pour la sortie d'un fichier txt. Mon Visual Studio n'est pas venu avec le maréchal fichiers d'en-tête de laquelle plusieurs réponses j'ai trouvé, a déclaré à utiliser. Après beaucoup de tâtonnements, j'ai enfin trouvé une solution à ce problème qui utilise le Système::Runtime::InteropServices:
Et voici la page MSDN avec l'exemple:
http://msdn.microsoft.com/en-us/library/1b4az623(v=vs. 80).aspx
Je sais que c'est une jolie solution simple, mais ce qui m'a pris des HEURES de dépannage et de visiter plusieurs forums afin de trouver enfin quelque chose qui a travaillé.
J'ai trouvé un moyen facile d'obtenir un std::string à partir d'une Chaîne^ est d'utiliser sprintf().
Pas nécessaire d'appeler le Maréchal de fonctions!
Mise à JOUR Merci à Eric, j'ai modifié le code de l'échantillon pour vérifier la taille de la chaîne d'entrée pour empêcher le débordement de la mémoire tampon.
C# utilise l'UTF16 format pour ses cordes.
Donc, en plus il suffit de convertir les types, vous devriez aussi être conscient de la chaîne de format réel.
Lors de la compilation pour Multi-byte Character set Visual Studio et la Win API suppose UTF8 (en Fait de codage de windows qui est Windows-28591 ).
Lors de la compilation pour jeu de Caractères Unicode Visual studio et la Win API assumer UTF16.
Donc, vous devez convertir la chaîne de UTF16 à UTF8 format en tant que bien, et pas seulement convertir à std::string.
Cela deviendra nécessaire lorsque l'on travaille avec des caractères multi-formats à l'instar de certains des langues non latines.
L'idée est de décider que
std::wstring
toujours représente UTF16.Et
std::string
toujours représente UTF8.Ce n'est pas appliquée par le compilateur, c'est plus d'une bonne politique.
Ou dans un plus compact de la syntaxe:
Je tiens à rester à l'écart de la marshaller.
Semble beaucoup plus propre et plus rapide pour moi. Pas besoin de s'inquiéter à propos de la création et de la suppression d'un contexte.
//J'ai utilisé VS2012 à écrire de code ci-dessous-- convert_system_string à Standard_Sting