2010-12-08 5 views
12

Comment puis-je convertir std :: wstring en const * char en C++?convertir std :: wstring en const * char en C++

+1

Il y a plusieurs façons. Lequel vous convient le mieux dépend de beaucoup de faits que vous n'avez pas fournis. Quel encodage voulez-vous avoir le résultat? Quelle plate-forme/conversion de codage utilisez-vous? – sbi

+0

Quel système d'exploitation? Au moins sur Windows, vous devriez le faire rarement, par exemple. si vous voulez écrire une chaîne UTF-8 dans un fichier. – Philipp

+0

Il y a ce "minimum absolu que tout développeur de logiciel doit savoir absolument et absolument sur les jeux de caractères et d'Unicode (pas d'excuses!)] (Http://www.joelonsoftware.com/articles/Unicode.html)", qui doit être lu ! – Jaywalker

Répondre

11

Vous pouvez convertir un std::wstring à un const wchar_t * en utilisant la fonction membre c_str:

std::wstring s; 
const wchar_t *str = s.c_str(); 

Cependant, une conversion à un const char * n'est pas naturel: il faut un appel supplémentaire à std::wcstombs.

+1

pouvez-vous donner un exemple complet, y compris wcstombs? J'essaie de résoudre cela comme vous le suggérez. –

+0

lorsque wstring est wStr: 'const wchar_t * str = wStr.c_str(); size_t taille = wcslen (str) * 2 + 2; char * StartPoint = nouveau caractère [taille]; size_t c_size; wcstombs_s (& c_size, StartPoint, taille, str, taille); ' – arielhad

+0

@arielhad Pourquoi +2 à la fin de la définition de la taille? En outre, cette 'formule' pour la taille suppose que char est 8 bits, et wchar_t est 16 bits, n'est-ce pas? Je pense qu'il vaudrait mieux l'écrire en appelant sizeof() car ce n'est pas forcément vrai pour toutes les plateformes. – KjMag

5

Vous ne pouvez pas faire cela comme ça. std::wstring représente une chaîne de caractères larges (Unicode), tandis que char* dans ce cas est une chaîne de caractères ASCII. Il doit y avoir une conversion de page de code d'Unicode en ASCII.

Pour effectuer la conversion, vous pouvez utiliser les fonctions de bibliothèque standard telles que wcstombs ou la fonction Windows WideCharToMultiByte.

Mise à jour pour intégrer les informations des commentaires, merci de le signaler.

+1

La bibliothèque standard gère cela. Voir 'wcrtomb',' wcsrtombs', par exemple. – nothrow

+1

@Yossarian: Le problème avec les fonctions de la bibliothèque standard est que la norme ne définit pas quel jeu de caractères larges, ni quels jeux de caractères multi-octets, sont utilisés dans 'wcstombs'. Si vous avez besoin de la chaîne dans un encodage spécifique (comme UTF-8), vous devez écrire la conversion vous-même, ou utiliser une extension spécifique à la plate-forme (telle que WideCharToMultiByte) –

+0

std :: string peut contenir unicode via UTF- 8 et std :: wstring n'est pas marié à UTF-16/UTF-32. Donc, ceci est une réponse très trompeuse. – anno

Questions connexes