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

How to convert a TCHAR array to std::string?

本文关键字:std 转换 string 数组 TCHAR      更新时间:2023-10-16

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

TCHAR只是一个typedef,根据编译配置,它默认为charwchar_t

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

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

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

我承认我的答案迟到了,但有了"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!

TCHAR是char或wchar_t,因此

typedef basic_string<TCHAR>   tstring;

是一种方法。

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

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

快速且肮脏的解决方案:

TCHAR str[256] = {};
// put something in str...

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

简单!

std::string tcharToChar(TCHAR* buffer)
{
    char *charBuffer = NULL;
    std::string returnValue;
    int lengthOfbuffer = lstrlenW(buffer);
    if(buffer!=NULL)
    {
        charBuffer = (char*)calloc(lengthOfbuffer+1,sizeof(char));
    }
    else
    {
        return NULL;
    }
    for (int index = 0;
        index < lengthOfbuffer;
        index++)
    {
        char *singleCharacter = (char*)calloc(2,sizeof(char));
        singleCharacter[0] = (char)buffer[index];
        singleCharacter[1] = '';
        strcat(charBuffer, singleCharacter);
        free(singleCharacter );
    }
    strcat(charBuffer, "");
    returnValue.append(charBuffer);
    free(charBuffer);
    return returnValue;
    
}