参考:http://www.velocityreviews.com/forums/t503692-i-need-help-for-std-codecvt.html
static string to_string(const wstring& str, const locale& loc = std::locale(""))
{
typedef codecvt<wchar_t, char, mbstate_t> codecvt_t;
const codecvt_t& cc = use_facet<codecvt_t>(loc);
mbstate_t state = mbstate_t();
int buf_size = static_cast<int>(str.length() * (sizeof(wchar_t)/sizeof(char)));
char* buf = new char[buf_size+1];
const wchar_t* char_next;
char* byte_next;
int res = cc.out(state,
str.c_str(), str.c_str() + str.length(), char_next,
&buf[0], &buf[buf_size], byte_next);
if (res == codecvt_base::error) {
cerr << "codecvt convert fail. locale=" << loc.name() << endl;
return string();
}
*byte_next = 0;
string result(buf);
delete buf;
return result;
}
static wstring to_wstring(const string& str, const locale& loc = std::locale(""))
{
typedef codecvt<wchar_t, char, mbstate_t> codecvt_t;
const codecvt_t& cc = use_facet<codecvt_t>(loc);
mbstate_t state = mbstate_t();
int buf_size = cc.length(state, str.c_str(), str.c_str() +
str.length(), str.length());
wchar_t* buf = new wchar_t[buf_size+1];
wchar_t* char_next;
const char* byte_next;
int res = cc.in(state,
str.c_str(), str.c_str() + str.length(), byte_next,
&buf[0], &buf[buf_size], char_next);
if (res == codecvt_base::error) {
cerr << "codecvt convert fail. locale=" << loc.name() << endl;
return wstring();
}
*char_next = 0;
wstring result(buf);
delete buf;
return result;
}