2009-11-24 31 views
7

Tengo una cadena en formato char* y me gustaría convertirla a wchar_t*, para pasar a una función de Windows.¿Cómo convierto una cadena de caracteres en una cadena wchar_t?

+2

mayoría de las funciones de Windows en realidad son de dos tipos, una "A "y" W "versión. P.ej. MessageBoxA/MessageBoxW, con una macro "MessageBox" refiriéndose a uno de los dos. Pero si usa el nombre explícito 'MessageBoxA', puede pasar un' char * 'independientemente de la configuración del proyecto. – MSalters

Respuesta

13

¿Ayuda esta pequeña función?

#include <cstdlib> 

int mbstowcs(wchar_t *out, const char *in, size_t size); 

Véase también la C++ reference

8

Si no desea vincular con la biblioteca de tiempo de ejecución C, utilice la llamada a la API MultiByteToWideChar, por ejemplo:

const size_t WCHARBUF = 100; 
const char s[] = "HELLO"; 
wchar_t wszDest[WCHARBUF]; 
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szSource, -1, wszDest, WCHARBUF); 
+2

Dependiendo de dónde provenga su cadena, también puede considerar CP_UTF8 en lugar de CP_ACP. Puede almacenar todos los caracteres Unicode. – asveikau

+0

Para mí en windows10 con visual studio 2017, CP_ACP funcionó. CP_UTF8 no. – netskink

2

el SDK de Windows especifica 2 funciones en kernel32.lib para convertir cadenas desde y hacia un conjunto ancho de caracteres. esos son MultiByteToWideChar() y WideCharToMultiByte().

tenga en cuenta que, a diferencia del nombre de la función, la cadena no necesariamente utiliza un juego de caracteres de varios bytes, sino que puede ser una cadena ANSI simple. También tenga en cuenta que esas funciones comprenden UTF-7 y UTF-8 como un conjunto de caracteres de múltiples bytes. el conjunto de caracteres de char ancho es siempre UTF-16. respuesta

1

de schnaader utilizar la conversión definida por la configuración regional C actual, éste utiliza la interfaz de configuración regional de C++ (que dijo que era fácil?)

std::wstring widen(std::string const& s, std::locale loc) 
{ 
    std::char_traits<wchar_t>::state_type state = { 0 }; 

    typedef std::codecvt<wchar_t, char, std::char_traits<wchar_t>::state_type > 
     ConverterFacet; 

    ConverterFacet const& converter(std::use_facet<ConverterFacet>(loc)); 

    char const* nextToRead = s.data(); 
    wchar_t buffer[BUFSIZ]; 
    wchar_t* nextToWrite; 
    std::codecvt_base::result result; 
    std::wstring wresult; 

    while ((result 
      = converter.in 
        (state, 
        nextToRead, s.data()+s.size(), nextToRead, 
        buffer, buffer+sizeof(buffer)/sizeof(*buffer), nextToWrite)) 
      == std::codecvt_base::partial) 
    { 
     wresult.append(buffer, nextToWrite); 
    } 

    if (result == std::codecvt_base::error) { 
     throw std::runtime_error("Encoding error"); 
    } 
    wresult.append(buffer, nextToWrite); 
    return wresult; 
} 
Cuestiones relacionadas