c++ - ¿Cómo convertir una matriz TCHAR a std:: string?
windows unicode (4)
El tipo de TCHAR es char
o wchar_t
, dependiendo de la configuración de su proyecto.
#ifdef UNICODE
// TCHAR type is wchar_t
#else
// TCHAR type is char
#endif
Entonces, si debe usar std::string
lugar de std::wstring
, debe usar una función de conversión. Puedo usar wcstombs
o 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
¿Cómo convierto una matriz TCHAR
a std::string
(no a std::basic_string
)?
Mi respuesta es tarde, lo admito, pero con las respuestas de ''Alok Save'' y algunas investigaciones, ¡he encontrado una buena manera! (Nota: no probé mucho esta versión, por lo que podría no funcionar en todos los casos, pero por lo que debería haber probado):
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!
TCHAR es char o wchar_t, por lo que un
typedef basic_string<TCHAR> tstring;
Es una forma de hacerlo.
La otra es omitir char
y usar std::wstring
.
TCHAR
es solo un typedef que, de acuerdo con la configuración de su compilación, puede ser char
o wchar
.
La biblioteca de plantillas estándar admite tanto ASCII (con std::string
) como conjuntos de caracteres amplios (con std::wstring
). Todo lo que necesitas hacer es typedef String como std :: string o std :: wstring dependiendo de tu configuración de compilación. Para mantener la flexibilidad puede utilizar el siguiente código:
#ifndef UNICODE
typedef std::string String;
#else
typedef std::wstring String;
#endif
Ahora puedes usar String
en tu código y dejar que el compilador maneje las partes desagradables. La cadena ahora tendrá constructores que te permiten convertir TCHAR
a std::string
o std::wstring
.