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)とかになるのかなぁ。