TCHAR
配列をstd::string
(std::basic_string
ではなく)に変換するにはどうすればよいですか?
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
を使用して、コンパイラに厄介な部分を処理させることができます。文字列には、TCHAR
をstd::string
またはstd::wstring
に変換できるコンストラクタが追加されました。
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
TCHARはcharまたはwchar_tであるため、
typedef basic_string<TCHAR> tstring;
それを行う1つの方法です。
もう1つは、char
を完全にスキップして、単にstd::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!