Domanda

Ho cambiato la mia classe da utilizzare std :: string (in base alla risposta che ho ricevuto qui ma una funzione che ho rendimenti wchar_t *. Come faccio a convertirlo in std :: string?

Ho provato questo:

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

ma dice l'errore C2440: 'inizializzazione': impossibile convertire da 'wchar_t *' a 'std :: basic_string <_Elem, _Traits, _Ax>'

È stato utile?

Soluzione

si potrebbe utilizzare wstring e tenere tutto in Unicode

Altri suggerimenti

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

È possibile convertire una stringa char largo per una stringa ASCII utilizzando la seguente funzione:

#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();
}

Essere consapevoli del fatto che questo sarà solo sostituire qualsiasi carattere esteso per il quale un carattere ASCII equivalente non esiste con il parametro dfault; non converte da UTF-16 a UTF-8. Se si desidera convertire in UTF-8 utilizzare una libreria come ICU .

Questa è una vecchia questione, ma se è il caso che non stai cercando veramente conversioni, ma piuttosto utilizzando la roba TCHAR da Mircosoft di essere in grado di costruire sia ASCII e Unicode, si potrebbe ricordare che std :: string è davvero

typedef std::basic_string<char> string

Così potremmo definire la nostra typedef, dire

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

allora si potrebbe utilizzare magic::string con TCHAR, LPCTSTR, e così via

solo per divertimento: -):

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

A seguito di codice è più conciso:

wchar_t wstr[500];
char string[500];
sprintf(string,"%ls",wstr);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top