32

TCHAR配列をstd::string(ではなく)に変換するにはどうすればよいstd::basic_stringですか?

4

6 に答える 6

36

TCHARは単なるtypedefであり、コンパイル構成に応じて、デフォルトでcharまたはになりwchar_tます。

標準テンプレートライブラリは、ASCII(with std::string)とワイド文字セット(with std::wstring)の両方をサポートします。あなたがする必要があるのは、コンパイル構成に応じて、std::stringまたはstd::wstringのいずれかとしてstringをtypedefすることです。柔軟性を維持するために、次のコードを使用できます。

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

これで、コードで使用Stringして、コンパイラに厄介な部分を処理させることができます。StringにはTCHARstd::stringまたはに変換できるコンストラクターが含まれるようになりますstd::wstring

于 2011-06-09T10:38:31.867 に答える
5

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
于 2011-06-09T10:40:19.703 に答える
5

TCHARはcharまたはwchar_tのいずれかであるため、

typedef basic_string<TCHAR>   tstring;

それを行う1つの方法です。

もう1つは、char完全にスキップして、を使用することstd::wstringです。

于 2011-06-09T10:43:54.820 に答える
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!
于 2015-07-27T21:02:37.127 に答える
0

単純!

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] = '\0';
        strcat(charBuffer, singleCharacter);
        free(singleCharacter );
    }
    strcat(charBuffer, "\0");
    returnValue.append(charBuffer);
    free(charBuffer);
    return returnValue;
    
}
于 2019-03-11T11:59:53.153 に答える
0

迅速で汚い解決策:

TCHAR str[256] = {};

// put something in str...


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

std::cout << strtmp << std::endl;
于 2019-11-18T15:36:14.020 に答える