e-tipsmemo

ごった煮

stringとwstringとtstring

Visual Studioで文字列を扱うとき、
以下の設定の違いで

f:id:katakanan:20180616104252p:plain
f:id:katakanan:20180616104219p:plain

TCHARの定義がかわる。
f:id:katakanan:20180616104721p:plain
参考
Tchar.h における汎用テキストのマッピング

typedef std::basic_string<TCHAR> tstring;
typedef std::basic_stringstream<TCHAR> tstringstream;
typedef std::basic_ostringstream<TCHAR> tostringstream;
typedef std::basic_istringstream<TCHAR> tistringstream;

どこかのサイトで見たが、こうしておけばどちらにでも対応できる。
(本当は最初から std::wstring で良かった)

Unicode文字セットのときの、
上の定義でのtstringはstd::wstringと同じであり、
std::stringとの相互変換方法を調べた。

見つかったサイト。
kryozahiro.hateblo.jp

このサイトではwcstombsという関数を使っているが、これはもう古くてでVisual Studio 2017ではエラーがでてしまうので
微修正した。

//std::wstring -> std::string
void narrow(const std::wstring &src, std::string &dest) {
	char *mbs = new char[src.length() * MB_CUR_MAX + 1];
	size_t i;
	wcstombs_s(&i, mbs, src.length() * MB_CUR_MAX + 1, src.c_str(), src.length() * MB_CUR_MAX + 1);

	dest = mbs;
	delete[] mbs;
}
//std::string -> std::wstring
void widen(const std::string &src, std::wstring &dest) {
	wchar_t *wcs = new wchar_t[src.length() + 1];
	size_t i;
	mbstowcs_s(&i, wcs, src.length() + 1, src.c_str(), src.length() + 1);
	dest = wcs;
	delete[] wcs;
}

多分これで良いんじゃないかとおもう。