c++ winapi unicode mingw type-conversion

c++ - Cómo convertir char*a wchar_t*?



winapi unicode (6)

Intenté implementar una función como esta, pero lamentablemente no funciona:

const wchar_t *GetWC(const char *c) { const size_t cSize = strlen(c)+1; wchar_t wc[cSize]; mbstowcs (wc, c, cSize); return wc; }

Mi objetivo principal aquí es poder integrar cadenas de caracteres normales en una aplicación Unicode. Cualquier consejo que ustedes puedan ofrecer es muy apreciado.


En su ejemplo, wc es una variable local que será desasignada cuando finalice la llamada a la función. Esto te pone en un territorio de comportamiento indefinido.

La solución simple es esta:

const wchar_t *GetWC(const char *c) { const size_t cSize = strlen(c)+1; wchar_t* wc = new wchar_t[cSize]; mbstowcs (wc, c, cSize); return wc; }

Tenga en cuenta que el código de llamada tendrá que desasignar esta memoria, de lo contrario, tendrá una pérdida de memoria.


Está devolviendo la dirección de una variable local asignada en la pila. Cuando su función retorna, el almacenamiento para todas las variables locales (como wc ) se desasigna y está sujeto a ser inmediatamente sobrescrito por otra cosa.

Para solucionarlo, puede pasar el tamaño del búfer a GetWC , pero entonces tiene prácticamente la misma interfaz que mbstowcs . O bien, podría asignar un nuevo búfer dentro de GetWC y devolver un puntero a eso, dejándolo a la persona que llama para desasignar el búfer.


Hice algo así. Los primeros 2 ceros se deben a que no sé qué tipo de cosas de tipo ASCII quiere de mí. La sensación general que tuve fue crear una matriz de caracteres temporales. pasar en la amplia gama de caracteres. auge. funciona. El +1 asegura que el carácter de terminación nulo está en el lugar correcto.

char tempFilePath[MAX_PATH] = "I want to convert this to wide chars"; int len = strlen(tempFilePath); // Converts the path to wide characters int needed = MultiByteToWideChar(0, 0, tempFilePath, len + 1, strDestPath, len + 1);


Su problema no tiene nada que ver con las codificaciones, es una simple cuestión de entender el C ++ básico. Está devolviendo un puntero a una variable local de su función, que se habrá salido del alcance cuando cualquiera pueda usarlo, creando así un comportamiento indefinido (es decir, un error de programación).

Siga esta regla de oro: "Si usa punteros desnudos, está haciendo las cosas mal (excepto cuando no lo está)".

Anteriormente publiqué un código para hacer la conversión y comunicar la entrada y la salida en los objetos C ++ std::string y std::wstring .


Use std::wstring lugar de una matriz de longitud variable C99. El estándar actual garantiza un buffer contiguo para std::basic_string . P.ej,

std::wstring wc( cSize, L''#'' ); mbstowcs( &wc[0], c, cSize );

C ++ no admite matrices de longitud variable C99, por lo que si compiló su código como puro C ++, ni siquiera compilaría.

Con ese cambio, su tipo de devolución de función también debería ser std::wstring .

Recuerde establecer la configuración regional relevante en main .

Por ejemplo, setlocale( LC_ALL, "" ) .

Saludos y hth.,


const char* text_char = "example of mbstowcs"; size_t length = strlen(text_char );

Ejemplo de uso "mbstowcs"

std::wstring text_wchar(length, L''#''); //#pragma warning (disable : 4996) // Or add to the preprocessor: _CRT_SECURE_NO_WARNINGS mbstowcs(&text_wchar[0], text_char , length);

Ejemplo de uso "mbstowcs_s"

Microsoft sugiere utilizar "mbstowcs_s" en lugar de "mbstowcs".

Campo de golf:

Ejemplo de Mbstowcs

mbstowcs_s, _mbstowcs_s_l

wchar_t text_wchar[30]; mbstowcs_s(&length, text_wchar, text_char, length);