How to convert a TCHAR array to std::string?
TCHAR
is just a typedef that, depending on your compilation configuration, either defaults to char
or wchar_t
.
Standard Template Library supports both ASCII (with std::string
) and wide character sets (with std::wstring
). All you need to do is to typedef String as either std::string or std::wstring depending on your compilation configuration. To maintain flexibility you can use the following code:
#ifndef UNICODE typedef std::string String; #else typedef std::wstring String; #endif
Now you may use String
in your code and let the compiler handle the nasty parts. String will now have constructors that lets you convert TCHAR
to std::string
or std::wstring
.
TCHAR type is char
or wchar_t
, depending on your project settings.
#ifdef UNICODE // TCHAR type is wchar_t #else // TCHAR type is char #endif
So if you must use std::string
instead of std::wstring
, you should use a converter function. I may use wcstombs
or 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