2010-12-02 47 views
24

he cambiado de clase para utilizar std :: string (en base a la respuesta que obtuve here sino una función que tengo vuelve wchar_t * ¿Cómo convierto a std :: string¿Cómo convierto wchar_t * a std :: string? .?

He intentado esto:

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

pero dice error C2440: 'inicialización': no ​​se puede convertir de 'wchar_t *' a 'std :: basic_string < _Elem, _Traits, _Ax>'

Respuesta

8

se podía utilizar wstring y mantener todo en Unicode

+1

y todavía me sale un const char * si uso .c_str()? Tengo otras funciones que esperan const char * – codefrog

+1

Voy a hacer una conjetura de que está construyendo su proyecto en Unicode, pero realmente no quiero eso. Si esto es correcto, puede cambiar las propiedades de su proyecto para que no se construya para Unicode y luego puede usar 'cadena'. Verifique esto en Propiedades del proyecto, Propiedades de configuración, General, Conjunto de caracteres. Necesita esto para decir 'Usar conjunto de caracteres de varios bytes 'para deshacerse de Unicode en todas partes. –

+0

Originalmente planeé usar Unicode para algunas partes, pero luego decidí que me preocuparé por eso más adelante. En este punto, solo me molesta que el programa funcione. Estoy usando SimpleINI y SimpleOpt para cargar opciones y usa Unicode. También estoy usando el SDK de otro software que también usa Unicode. Deshabilitar Unicode todos juntos puede hacer que incluso esas partes del código dejen de funcionar. – codefrog

6

Puede convertir una cadena de carbón de ancho en una cadena ASCII usando la siguiente función:

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

Tenga en cuenta que esto sólo va a sustituir a cualquier carácter ancho para el cual un carácter ASCII equivalente no existe con el parámetro dfault; no convierte de UTF-16 a UTF-8. Si desea convertir a UTF-8 use una biblioteca como ICU.

+0

Gracias por el código de conversión. Voy a intentar esto también. – codefrog

+1

+1 Gracias por el código de conversión, me ha ahorrado mucho tiempo – Martin

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

¡Proporciona la respuesta real a la pregunta! – Ian

+0

Me gusta esta solución por su simplicidad. Sin embargo, una pequeña explicación no podría doler. Deja abierta la cuestión de cómo se convierten realmente los personajes. ¿Hay una pérdida de información o los caracteres anchos se convierten a Unicode? – Julian

+0

No sé por qué esta respuesta obtuvo tantos upvotes, lo que hace es equivalente a 'char c = static_cast (wideChar)' para cada carácter, por lo que obviamente pierde información si los caracteres de cadena ancha no están en ** Rango ASCII **. – zett42

5

Ésta es una vieja pregunta, pero si es el caso usted no está realmente en busca de conversiones, sino más bien el uso de la materia TCHAR de Mircosoft a ser capaces de construir ASCII y Unicode, que podría recordar que std :: cadena es realmente

typedef std::basic_string<char> string 

Así podríamos definir nuestra propia typedef, dicen

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

entonces se podría usar con magic::stringTCHAR,.210, y así sucesivamente

0

sólo por diversión :-):

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