MarshalAs(UnmanagedType.LPStr) - comment est-ce convertir en utf-8 chaînes de caractères char*

La question du titre est en gros ce que je voudrais vous demander:

[MarshalAs(UnmanagedType.LPStr)] - comment est-ce convertir en utf-8 chaînes de caractères char* ?

- Je utiliser la ligne ci-dessus lorsque je tente de communiquer entre c# et c++ dll;
plus précisément, entre:

somefunction(char *string) [c++ dll]

somefunction([MarshalAs(UnmanagedType.LPStr) string text) [c#]

Quand j'envoie mon texte utf-8 (scintilla.Le texte) par c# et dans ma dll c++,
Je me suis montré dans mon VS 10 débogueur:

  1. le c# string a été converti au char*
  2. l'résultant char* reflète bien le correspondant de l'utf-8 caractères (y compris le bit en coréen) dans la fenêtre espion.

Voici une capture d'écran (avec plus de détails):

MarshalAs(UnmanagedType.LPStr) - comment est-ce convertir en utf-8 chaînes de caractères char*

Comme vous pouvez le voir, initialScriptText[0] retourne le seul byte(char): 'B' et le contenu de char* initialScriptText sont affichés correctement (y compris coréen) dans le VS regarder la fenêtre.

En passant par la char un pointeur, il semble que l'anglais est enregistré comme un byte par char, tandis que le coréen semble être enregistrées comme deux octets par char. (le mot coréen dans la capture d'écran est de 3 lettres, donc enregistrés dans 6 octets)

Ce qui semble montrer que chaque "lettre" n'est pas enregistré dans l'égalité des contenants de taille, mais il en diffère en fonction de la langue. (possible allusion sur le type?)

Je suis en train d'essayer d'obtenir le même résultat en pur c++: la lecture dans les fichiers utf-8 et d'enregistrer le résultat en tant que char*.

Voici un exemple de ma tentative de lecture d'un fichier utf-8 et le convertir en char* en c++:

MarshalAs(UnmanagedType.LPStr) - comment est-ce convertir en utf-8 chaînes de caractères char*

observations:

  1. perte visuelle lors de la conversion de wchar_t* à char*
  2. depuis conséquent, s8 affiche la chaîne correctement, je sais que j'ai converti le fichier utf-8 contenu dans wchar_t* avec succès à char*
  3. depuis le 'résultat' conserve les octets que j'ai pris directement à partir du fichier, mais j'obtiens un résultat différent de ce que j'avais à c# (j'ai utilisé le même fichier), j'en ai conclu que le c# maréchal a mis le contenu de ce fichier à travers une autre procédure pour de plus amples muter le texte de char*.

(la capture d'écran montre aussi mon terrible échec dans l'utilisation de wcstombs)

note: je suis à l'aide de l'utf8 en-tête (http://utfcpp.sourceforge.net/)

Veuillez me corriger sur des erreurs dans mon code/observations.

J'aimerais être capable d'imiter le résultat, je suis passer par le c# maréchal et j'ai réalisé d'après passer par tout ce que je suis complètement coincé. Des idées?

UTF-8 est une variable largeur d'encodage, donc oui, les personnages peuvent être exprimées en 1 ou plusieurs octets. Vérifiez l'article de Wikipédia pour plus de détails.
Voir GDAL comment support de l'unicode des caractères en c#
Voir GDAL caractères unicode support en c#

OriginalL'auteur dk123 | 2012-11-08