62 votes

Comment convertir char* en wchar_t* ?

J'ai essayé d'implémenter une fonction comme celle-ci, mais malheureusement cela ne fonctionne pas :

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

    return wc;
}

Mon objectif principal ici est de pouvoir intégrer des chaînes de caractères normales dans une application Unicode. Tous les conseils que vous pouvez offrir sont grandement appréciés.

43voto

Andrew Shepherd Points 16670

Dans votre exemple, wc est une variable locale qui sera désallouée à la fin de l'appel de fonction. Cela vous met dans un territoire de comportement indéfini.

La solution simple est la suivante :

 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;
}

A noter que le code appelant devra alors désallouer cette mémoire, sinon vous aurez une fuite mémoire.

42voto

Cheers and hth. - Alf Points 59647

Utilisez un std::wstring au lieu d'un tableau de longueur variable C99. La norme actuelle garantit un tampon contigu pour std::basic_string . Par exemple,

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

C++ ne prend pas en charge les tableaux de longueur variable C99, et donc si vous compiliez votre code en C++ pur, il ne serait même pas compilé.

Avec ce changement, le type de retour de votre fonction devrait également être std::wstring .

N'oubliez pas de définir les paramètres régionaux pertinents dans main .

Par exemple, setlocale( LC_ALL, "" ) .

6voto

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

Exemple d'utilisation "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);

Exemple d'utilisation "mbstowcs_s"

Microsoft suggère d'utiliser "mbstowcs_s" au lieu de "mbstowcs".

Liens:

Exemple de Mbstowcs

mbstowcs_s, _mbstowcs_s_l

 wchar_t text_wchar[30];

mbstowcs_s(&length, text_wchar, text_char, length);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X