TCHAR
配列をstd::string
(ではなく)に変換するにはどうすればよいstd::basic_string
ですか?
6 に答える
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には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!
単純!
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;
}
迅速で汚い解決策:
TCHAR str[256] = {};
// put something in str...
// convert to string
std::string strtmp(&str[0], &str[255]);
std::cout << strtmp << std::endl;