Comment convertir un tableau TCHAR
en std::string
(pas à std::basic_string
)?
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
.
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
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
.
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!