2010-12-02 31 views
24

j'ai changé ma classe à utiliser std :: string (en fonction de la réponse que je suis arrivé here mais une fonction je wchar_t * retours Comment puis-je convertir en std :: stringComment convertir wchar_t * en std :: string? .?

J'ai essayé ceci:

std::string test = args.OptionArg(); 

mais il dit erreur C2440: 'initialisation': ne peut pas convertir 'wchar_t *' à 'std :: basic_string < _Elem, _Traits, _Ax>'

Répondre

8

Vous pouvez simplement utiliser wstring et tout garder en Unicode

+1

et je vais toujours obtenir un const char * si j'utilise .c_str()? J'ai d'autres fonctions qui attendent const char * – codefrog

+1

Je vais faire une supposition que vous construisez votre projet en Unicode, mais ne le veux vraiment pas. Si cela est correct, vous pouvez modifier les propriétés de votre projet pour ne pas construire pour Unicode et ensuite vous pouvez utiliser 'string'. Cochez cette case dans Propriétés du projet, Propriétés de configuration, Général, Jeu de caractères. Vous avez besoin de ceci pour dire 'Use Multibyte Character Set' pour vous débarrasser d'Unicode partout. –

+0

A l'origine, j'avais prévu d'utiliser Unicode pour certaines parties, mais j'ai décidé de m'en inquiéter plus tard. À ce stade, je suis seulement dérangé pour que le programme fonctionne. J'utilise SimpleINI et SimpleOpt pour charger les options et il utilise Unicode. J'utilise aussi le SDK d'un autre logiciel qui utilise aussi Unicode. Si vous désactivez Unicode tous ensemble, même ces parties du code risquent de ne plus fonctionner. – codefrog

6

Vous pouvez convertir une grande chaîne char à une chaîne ASCII en utilisant la fonction suivante:

#include <locale> 
#include <sstream> 
#include <string> 

std::string ToNarrow(const wchar_t *s, char dfault = '?', 
         const std::locale& loc = std::locale()) 
{ 
    std::ostringstream stm; 

    while(*s != L'\0') { 
    stm << std::use_facet< std::ctype<wchar_t> >(loc).narrow(*s++, dfault); 
    } 
    return stm.str(); 
} 

Soyez conscient que ce sera juste de remplacer tout caractère large pour lequel un caractère ASCII équivalent n'existe pas avec le paramètre dfault; il ne convertit pas de UTF-16 à UTF-8. Si vous souhaitez convertir en UTF-8, utilisez une bibliothèque telle que ICU.

+0

Merci pour le code de conversion. Je vais essayer ça aussi. – codefrog

+1

+1 Merci pour le code de conversion, m'a sauvé beaucoup de temps – Martin

29
wstring ws(args.OptionArg()); 
string test(ws.begin(), ws.end()); 
+4

Fournit la réponse réelle à la question! – Ian

+0

J'aime cette solution pour sa simplicité. Cependant, une petite explication ne pouvait pas faire de mal. Cela laisse ouverte la question de savoir comment les personnages sont réellement convertis. Y a-t-il une perte d'information ou les caractères larges sont-ils convertis en unicode? – Julian

+0

Je ne sais pas pourquoi cette réponse a eu autant de upvotes, ce qu'elle fait équivaut à 'char c = static_cast (wideChar)' pour chaque caractère, donc il perd évidemment de l'information si les caractères larges ne sont pas dans ** Gamme ASCII **. – zett42

5

Ceci est une vieille question, mais si c'est le cas, vous n'êtes pas vraiment chercher des conversions, mais plutôt en utilisant les choses TCHAR de Mircosoft pour être en mesure de construire ASCII et Unicode, vous pouvez rappeler que std :: chaîne est vraiment

typedef std::basic_string<char> string 

on pourrait donc définir notre propre typedef, dire

#include <string> 
namespace magic { 
typedef std::basic_string<TCHAR> string; 
} 

Ensuite, vous pouvez utiliser magic::string avec TCHAR, LPCTSTR, et ainsi de suite

0

juste pour le plaisir :-):

const wchar_t* val = L"hello mfc"; 
std::string test((LPCTSTR)CString(val));