web-dev-qa-db-fra.com

Comment convertir wchar_t * en std :: string?

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>'

30
codefrog

Vous pouvez simplement utiliser wstring et tout garder en Unicode

7
Steve Townsend
wstring ws( args.OptionArg() );
string test( ws.begin(), ws.end() );
45
Ulterior

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 .

8
Praetorian

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.

5
paulluap

Le code suivant est plus concis:

wchar_t wstr[500];
char string[500];
sprintf(string,"%ls",wstr);
2
Pamela Hauff

juste pour le fun :-):

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