web-dev-qa-db-fra.com

Comment convertir un tableau TCHAR en std :: string?

Comment convertir un tableau TCHAR en std::string (pas à std::basic_string)?

27
ashmish2

TCHAR est juste un typedef qui, selon la configuration de votre compilation, soit par défaut char ou wchar.

La bibliothèque de modèles standard prend en charge les deux ASCII (avec std::string) et de larges jeux de caractères (avec std::wstring). Tout ce que vous devez faire est de typedef String en tant que std :: string ou std :: wstring selon votre configuration de compilation. Pour conserver la flexibilité, vous pouvez utiliser le code suivant:

#ifndef UNICODE  
  typedef std::string String; 
#else
  typedef std::wstring String; 
#endif

Vous pouvez maintenant utiliser String dans votre code et laisser le compilateur gérer les parties désagréables. La chaîne aura désormais des constructeurs qui vous permettront de convertir TCHAR en std::string ou std::wstring.

34
Alok Save

Le type TCHAR est char ou wchar_t, en fonction des paramètres de votre projet.

 #ifdef UNICODE
     // TCHAR type is wchar_t
 #else
     // TCHAR type is char
 #endif

Donc, si vous devez utiliser std::string au lieu de std::wstring, vous devez utiliser une fonction de conversion. Je peux utiliser wcstombs ou WideCharToMultiByte .

TCHAR * text;

#ifdef UNICODE
    /*/
    // Simple C
    const size_t size = ( wcslen(text) + 1 ) * sizeof(wchar_t);
    wcstombs(&buffer[0], text, size);
    std::vector<char> buffer(size);
    /*/
    // Windows API (I would use this)
    std::vector<char> buffer;
    int size = WideCharToMultiByte(CP_UTF8, 0, text, -1, NULL, 0, NULL, NULL);
    if (size > 0) {
        buffer.resize(size);
        WideCharToMultiByte(CP_UTF8, 0, text, -1, static_cast<BYTE*>(&buffer[0]), buffer.size(), NULL, NULL);
    }
    else {
        // Error handling
    }
    //*/
    std::string string(&buffer[0]);
#else
    std::string string(text);
#endif
5
Naszta

TCHAR est soit char soit wchar_t, donc un

typedef basic_string<TCHAR>   tstring;

est une façon de le faire.

L'autre consiste à ignorer char et à utiliser simplement std::wstring.

4
Bo Persson

Ma réponse est en retard, je l'admets, mais avec les réponses de "Alok Save" et quelques recherches, j'ai trouvé un bon moyen! (Remarque: je n'ai pas beaucoup testé cette version, donc elle pourrait ne pas fonctionner dans tous les cas, mais d'après ce que j'ai testé, elle devrait):

TCHAR t = SomeFunctionReturningTCHAR();
std::string str;

#ifndef UNICODE
    str = t;
#else
    std::wstring wStr = t;
    str = std::string(wStr.begin(), wStr.end());
#endif

std::cout << str << std::endl; //<-- should work!
2
Aemmel