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

ash*_*sh2 27 c++ windows string unicode tchar

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

Alo*_*ave 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
Run Code Online (Sandbox Code Playgroud)

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

  • 问题是我必须调用一个接受std :: string的接口,所以我不能发送std :: wstring :( (3认同)
  • @antred所以`typedef std :: wcout std_tcout`和`std_tstring`等?我不能......让自己成为这样的标准.然后,我曾经一直为图形操作做这件事.为什么`std :: basic_string <TCHAR>`对于string的typedef的前半部分是否有明显的区别? (2认同)

Nas*_*zta 5

TCHAR类型是charwchar_t,取决于您的项目设置.

 #ifdef UNICODE
     // TCHAR type is wchar_t
 #else
     // TCHAR type is char
 #endif
Run Code Online (Sandbox Code Playgroud)

因此,如果必须使用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
Run Code Online (Sandbox Code Playgroud)


Bo *_*son 5

TCHAR 要么是 char 要么是 wchar_t,所以

typedef basic_string<TCHAR>   tstring;
Run Code Online (Sandbox Code Playgroud)

是一种方法。

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


小智 5

我的回答晚了,我承认这一点,但是通过“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!
Run Code Online (Sandbox Code Playgroud)