std::stringとstd::wstringの相互変換

ポータブルで簡単な方法を探していたら、
http://ml.tietew.jp/cppll/cppll/article/4783
がよさそうだったけど、バグがあったのでいろいろ修正してみた。

#include <cstdlib>
#include <string>

//ワイド文字列からマルチバイト文字列
//ロケール依存
void narrow(const std::wstring &src, std::string &dest) {
	char *mbs = new char[src.length() * MB_CUR_MAX + 1];
	wcstombs(mbs, src.c_str(), src.length() * MB_CUR_MAX + 1);
	dest = mbs;
	delete [] mbs;
}

//マルチバイト文字列からワイド文字列
//ロケール依存
void widen(const std::string &src, std::wstring &dest) {
	wchar_t *wcs = new wchar_t[src.length() + 1];
	mbstowcs(wcs, src.c_str(), src.length() + 1);
	dest = wcs;
	delete [] wcs;
}

使う場合はmainの最初とかで

setlocale(LC_CTYPE, "");

する必要有り。

ロケール使うから環境依存なんだけど、どこでもコンパイルが通って、実用上どこでも使えて、かつ簡単な方法なので目的は達成している・・・はず。
これ以外だとstd::codecvtを使う方法(http://d.hatena.ne.jp/Cryolite/20041027)とかになるのかなぁ。