Как преобразовать массив TCHAR
в std::string
(не в std::basic_string
)?
Как преобразовать массив TCHAR в std::string?
Ответ 1
TCHAR
- это просто typedef, который, в зависимости от вашей конфигурации компиляции, по умолчанию равен char
или wchar
.
Стандартная библиотека шаблонов поддерживает как ASCII (с std::string
), так и широкие наборы символов (с std::wstring
). Все, что вам нужно сделать, это typedef String как std::string или std:: wstring в зависимости от вашей конфигурации компиляции. Чтобы поддерживать гибкость, вы можете использовать следующий код:
#ifndef UNICODE
typedef std::string String;
#else
typedef std::wstring String;
#endif
Теперь вы можете использовать String
в своем коде и позволить компилятору обрабатывать неприятные части. Теперь у String будут конструкторы, которые позволят вам преобразовать TCHAR
в std::string
или std::wstring
.
Ответ 2
Тип TCHAR char
или wchar_t
, в зависимости от настроек вашего проекта.
#ifdef UNICODE
// TCHAR type is wchar_t
#else
// TCHAR type is char
#endif
Итак, если вы должны использовать std::string
вместо std::wstring
, вы должны использовать функцию конвертера. Я могу использовать wcstombs
или 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
Ответ 3
TCHAR имеет значение char или wchar_t, поэтому <
typedef basic_string<TCHAR> tstring;
- один из способов сделать это.
Другой - пропустить char
вообще и просто использовать std::wstring
.
Ответ 4
Мой ответ задерживается, я признаю это, но с ответами "Alok Save" и некоторых исследований я нашел хороший способ! (Примечание: я не тестировал эту версию много, поэтому она может не работать в каждом случае, но из того, что я тестировал):
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!