web-dev-qa-db-ja.com

Unicodeプロジェクトでstd:stringをCStringに変換する方法

_std::string_があります。この_std:string_をCstringに変換する必要があります。

私は.c_str()を使用しようとしますが、それは非ユニコードプロジェクト専用であり、ユニコードプロジェクトを使用します(非ユニコードプロジェクトはVS2013で非推奨になっているため)。

誰でもUnicodeプロジェクトで_std::string_をCStringに変換する方法を示すことができますか?

12

CStringには、const char*CStringT::CStringT )をとる変換コンストラクターがあります。 std::stringCStringに変換するのは簡単です:

std::string stdstr("foo");
CString cstr(stdstr.c_str());

これは、UNICODEプロジェクトとMBCSプロジェクトの両方で機能します。 std::stringNUL文字が埋め込まれている場合、長さ引数を指定した変換コンストラクターを使用する必要があります。

std::string stdstr("foo");
stdstr += '\0';
stdstr += "bar";
CString cstr(stdstr.c_str(), stdstr.length());

変換コンストラクターは、現在のスレッドのANSIコードページ(CP_THREAD_ACP)を暗黙的に使用して、ANSIとUTF-16エンコードを変換することに注意してください。スレッドのANSIコードページを変更できない(または変更したくない)が、変換に使用する明示的なコードページを指定する必要がある場合は、別のソリューションを使用する必要があります(例 ATLおよびMFC文字列変換マクロ )。

30
IInspectable

Unicode CStringのコンストラクターはchar*を受け入れるため、これを行うことができます。

std::string str = "string";
CString ss(str.c_str());
1
cfanhacker

ATL変換マクロを使用します。 CStringを使用すると、すべてのケースで機能します。 CStringはMBCSまたはUnicodeのいずれかです...コンパイラの設定によって異なります。

std::string str = "string";
CString ss(CA2T(str.c_str());
1
xMRi

ボーナス:変換を頻繁に使用する場合、マクロを定義できます:

#define STDTOCSTRING(s) CString(s.c_str())

コードが読みやすくなります。

0
iKanor