Convertir const char* wstring
Je suis en train de travailler sur une extension native pour une base de zinc application flash et j'ai besoin de convertir un const char*
à un wstring
.
C'est mon code:
mdmVariant_t* appendHexDataToFile(const zinc4CallInfo_t *pCallInfo, int paramCount, mdmVariant_t **params) {
if(paramCount >= 2) {
const char *file = mdmVariantGetString(params[0]);
const char *data = mdmVariantGetString(params[1]);
return mdmVariantNewInt(native.AppendHexDataToFile(file, data));
}
else {
return mdmVariantNewBoolean(FALSE);
}
}
Mais native.AppendHexDataToFile()
besoin de deux wstring
.
Je ne suis pas très bon avec le C++ et je pense que tous les différents types de chaînes sont totalement confus et je n'ai pas trouvé quelque chose d'utile dans le filet. Donc je vous demande comment les gars pour le faire.
Modifier: Les Chaînes de caractères UTF-8 et je suis sur OSX et Windows XP/Vista/7
Avant d'essayer de traiter avec les caractères et les caractères de large, vous devriez être en mesure de répondre à la question suivante: Comment êtes-vous des chaînes codées et quelle conversion comptez-vous faire ?
En plus de @ereOn qui plattform utilisez-vous?
En plus de @ereOn qui plattform utilisez-vous?
OriginalL'auteur Johannes Klauß | 2012-05-24
Vous devez vous connecter pour publier un commentaire.
Je vous recommandons d'utiliser
std::string
au lieu de C-style cordes (char*
) dans la mesure du possible. Vous pouvez créerstd::string
objet deconst char*
par simple passage à son constructeur.Une fois que vous avez
std::string
, vous pouvez créer une fonction simple qui vous permet de convertirstd::string
contenant multi-octets caractères UTF-8std::wstring
contenant codé en UTF-16 points (16 bits représentation des caractères spéciaux à partir destd::string
).Il y a plus de façons de le faire, voici le chemin en utilisant MultiByteToWideChar fonction:
Vérifier ces questions:
La cartographie multi-octets caractères unicode point de la représentation
Pourquoi utiliser MultiByteToWideCharArray pour convertir std::string à std::wstring?
MultiByteToWideChar
est un Windows uniquement fonction. (OP est à l'aide de Windows, mais la question est marqué justec++
)Il serait mieux si votre solution est multi-plateforme.
C'est encore la meilleure conversion sur Windows. MS dit ici, ", Votre application peut convertir entre Windows les pages de code et de code OEM pages à l'aide de la norme C fonctions de la bibliothèque runtime. Cependant, l'utilisation de ces fonctions présente un risque de perte de données, car les caractères qui peuvent être représentés par chaque page de code ne correspondent pas exactement" Cependant, je me demande si on devrait utiliser les CP_ACP page de codes lors de la conversion de chaînes de caractères obtenus par WINAPI ...UN() des fonctions (par exemple, à partir de GetWindowTextA)
OriginalL'auteur
Autant que je sache, cela ne fonctionne qu'à partir de C++11 et ci-dessus:
Référence de réponse
OriginalL'auteur
Vous pouvez convertir
char
chaîne dewstring
directement en tant que code suivant:OriginalL'auteur
Vous avez besoin d'une bibliothèque qui peut encoder/décoder UTF8. Malheureusement, cette fonctionnalité n'est pas incluse avec le std c++ de la bibliothèque. Voici une bibliothèque, vous pouvez utiliser: http://utfcpp.sourceforge.net/
Voici un exemple d'utilisation de celui-ci:
OriginalL'auteur
Un ajout à la réponse de @anhoppe. Voici comment faire pour convertir
char*
:Et voici comment convertir
char*
si vous aussi vous connaissez déjà la longueur de la mémoire tampon:OriginalL'auteur
Sur OS X wstring utilise UTF-32, plutôt que de l'UTF-16. Vous pouvez faire la conversion comme ceci:
OriginalL'auteur
Voici un code que j'ai trouvé;
Et voici l'original post sur le forum avec une deuxième solution à l'aide de la fonction windows API MultiByteToWideChar:
http://forums.codeguru.com/archive/index.php/t-193852.html
Pourquoi pas "la"? il sera effacé de toute façon par la fonction de copie. C'est juste l'arbitraire d'un char pour faire de la place pour la chaîne.
Alors, pourquoi voulez-vous initialiser ces caractères
' '
quand vous savez qu'ils vont être réécrits?parce que la fonction de copie ne pas créer une zone tampon. Le tampon doit être créé en premier, ce qui est fait par le constructeur.
Ah, désolé, je vois maintenant. Je pensais que basic_string a également constructeur qui ne prend que
size_type count
, tout commestd::vector
.OriginalL'auteur