wstring与string互转

参考: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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值