をに変換する方法std::wstring
はTCHAR*
?std::wstring.c_str()
を返すため、機能しませんwchar_t*
。
から、またはからwchar_t*
への行き方を教えてください。TCHAR*
std::wstring
TCHAR*
これを使って :
wstring str1(L"Hello world");
TCHAR * v1 = (wchar_t *)str1.c_str();
#include <atlconv.h>
TCHAR *dst = W2T(src.c_str());
ANSIまたはUnicodeビルドで正しいことを行います。
wchar_tはTCHARと同じサイズではない可能性があるため、通常、これは不可能です。
文字セット間で変換するためのいくつかのソリューションがすでにリストされています。これらは、変換される範囲の文字セットが重複している場合に機能します。
私は可能な限り問題を完全に回避し、TCHAR文字セットで次のように定義されている標準の文字列を使用することを好みます。
typedef std::basic_string<TCHAR> tstring;
これを使用すると、WindowsのTCHARマクロとも互換性のある標準ライブラリ互換の文字列が得られます。
UNICODEが定義されている場合はTCHAR*はwchar_t*として定義され、それ以外の場合はchar*として定義されます。したがって、コードは次のようになります。
wchar_t* src;
TCHAR* result;
#ifdef UNICODE
result = src;
#else
//I think W2A is defined in atlbase.h, and it returns a stack-allocated var.
//If that's not OK, look at the documenation for wcstombs.
result = W2A(src);
#endif
次を使用できます。
wstring ws = L"Testing123";
string s(ws.begin(), ws.end());
// s.c_str() is what you're after
Windowsで操作していると仮定します。
Unicodeビルド構成を使用している場合、TCHAR
とwchar_t
は同じです。wchar_t
/ Zがtypeであるか、wchar_tがtypedefであるかによっては、キャストが必要になる場合があります。
マルチバイトビルド構成を使用している場合は、必要ですMultiByteToWideChar
(またはその逆)。