J'ai changé ma classe pour utiliser std :: string (basé sur la réponse que j'ai obtenue ici mais une fonction que j'ai retourne wchar_t *. Comment la convertir en std :: string?
J'ai essayé ceci:
std::string test = args.OptionArg();
mais il indique l'erreur C2440: 'initialisation': impossible de convertir de 'wchar_t *' en 'std :: basic_string <_Elem, _Traits, _Ax>'
Vous pouvez simplement utiliser wstring
et tout garder en Unicode
wstring ws( args.OptionArg() );
string test( ws.begin(), ws.end() );
Vous pouvez convertir une chaîne de caractères large en 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();
}
Sachez que cela remplacera simplement tout caractère large pour lequel un équivalent ASCII caractère n'existe pas avec le paramètre dfault
; il ne convertit pas de UTF-16 en UTF -8. Si vous souhaitez convertir en UTF-8, utilisez une bibliothèque telle que ICU .
C'est une vieille question, mais si c'est le cas, vous ne cherchez pas vraiment des conversions mais plutôt en utilisant les trucs TCHAR de Mircosoft pour pouvoir construire à la fois ASCII et Unicode, vous pourriez vous rappeler que std :: la chaîne est vraiment
typedef std::basic_string<char> string
Nous pourrions donc définir notre propre typedef, disons
#include <string>
namespace magic {
typedef std::basic_string<TCHAR> string;
}
Ensuite, vous pouvez utiliser magic::string
avec TCHAR
, LPCTSTR
, etc.
Le code suivant est plus concis:
wchar_t wstr[500];
char string[500];
sprintf(string,"%ls",wstr);
juste pour le fun :-):
const wchar_t* val = L"hello mfc";
std::string test((LPCTSTR)CString(val));