web-dev-qa-db-ja.com

TCHAR配列をstd :: stringに変換する方法は?

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

27
ashmish2

TCHARは、コンパイル構成に応じて、デフォルトでcharまたはwcharに設定されるtypedefです。

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

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

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

34
Alok Save

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
5
Naszta

TCHARはcharまたはwchar_tであるため、

typedef basic_string<TCHAR>   tstring;

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

もう1つは、charを完全にスキップして、単にstd::wstring

4
Bo Persson

私の答えは遅れていますが、それを認めますが、「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!
2
Aemmel