Подтвердить что ты не робот

Как преобразовать массив TCHAR в std::string?

Как преобразовать массив TCHAR в std::string (не в std::basic_string)?

4b9b3361

Ответ 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!