如何将TCHAR数组转换为std :: string?

时间:2011-06-09 10:34:58

标签: c++ string windows unicode tchar

如何将TCHAR数组转换为std::string(而不是std::basic_string)?

5 个答案:

答案 0 :(得分:34)

TCHAR只是一个typedef,根据您的编译配置,默认为charwchar

标准模板库支持ASCII(带std::string)和宽字符集(带std::wstring)。您需要做的就是将 typedef String作为std :: string或std :: wstring,具体取决于您的编译配置。为了保持灵活性,您可以使用以下代码:

#ifndef UNICODE  
  typedef std::string String; 
#else
  typedef std::wstring String; 
#endif

现在您可以在代码中使用String并让编译器处理令人讨厌的部分。字符串现在将具有允许您将TCHAR转换为std::stringstd::wstring的构造函数。

答案 1 :(得分:5)

TCHAR类型为charwchar_t,具体取决于您的项目设置。

 #ifdef UNICODE
     // TCHAR type is wchar_t
 #else
     // TCHAR type is char
 #endif

因此,如果您必须使用std::string而不是std::wstring,则应使用转换器功能。我可以使用wcstombsWideCharToMultiByte

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

答案 2 :(得分:4)

TCHAR是char或wchar_t,所以

typedef basic_string<TCHAR>   tstring;

是这样做的一种方式。

另一种方法是完全跳过char,只使用std::wstring

答案 3 :(得分:2)

我的回答很晚,我会承认,但是通过'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!

答案 4 :(得分:0)

快速而肮脏的解决方案:

TCHAR str[256] = {};

// put something in str...


// convert to string
std::string strtmp(&str[0], &str[255]);

std::cout << strtmp << std::endl;