9
votes

Comment convertir une chaîne de charme en chaîne wchar_t?

J'ai une chaîne dans char * format et souhaitez le convertir en wchar_t * , pour passer à une fonction Windows.


1 commentaires

La plupart des fonctions Windows viennent en deux saveurs, une version "A" et "W". Par exemple. Messageboxa / MessageBoxw, avec une macro "MessageBox", faisant référence à l'une des deux. Mais si vous utilisez le nom Explicit Messageboxa , vous pouvez transmettre un char * indépendamment des paramètres du projet.


4 Réponses :


17
votes

Cette petite fonction aide-t-elle?

#include <cstdlib>

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


0 commentaires

12
votes

Si vous ne voulez pas mettre un lien avec la bibliothèque d'exécution C, utilisez l'appel d'API multibytetowidechar, E.G:

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


2 commentaires

Selon l'endroit où vient votre chaîne, vous pouvez également envisager CP_UTF8 au lieu de CP_ACP. Il peut stocker tous les caractères Unicode.


Pour moi sur Windows10 avec Visual Studio 2017, CP_ACP a travaillé. Cp_utf8 n'a pas fait.



2
votes

Le SDK Windows Spécifie 2 fonctions dans Kernel32.Lib pour convertir des chaînes de et vers un ensemble de caractères large. Ce sont MultiByteTowidechar () et widechartomultibyte () < / code> .

Veuillez noter que, contrairement au nom de la fonction suggère, la chaîne n'utilise pas nécessairement un jeu de caractères multi-octets, mais peut être une simple chaîne ANSI. ALSE Notez que ces fonctions comprennent UTF-7 et UTF-8 en tant que jeu de caractères multi-octets. Le grand jeu de caractères de caractère est toujours UTF-16.


0 commentaires

1
votes

La réponse de Schnaader Utilisez la conversion définie par la locale C actuelle C, celle-ci utilise l'interface locale C ++ (qui a déclaré qu'elle était simple?)

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


0 commentaires