c++ string windows unicode tchar

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 .