参考: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;
}
本文提供了一种在C++中实现宽字符(wchar_t)与窄字符(char)字符串互相转换的方法。通过使用标准库中的codecvt类,该方法能够处理不同locale设置下的字符编码转换。文中给出了两个实用的函数,分别用于从宽字符到窄字符和从窄字符到宽字符的转换。
3832

被折叠的 条评论
为什么被折叠?



