编码处理相关
获取一个UTF-8的std::locale
std::locale Utf8Locale() { static std::locale utf8Local(std::locale(), ::new std::codecvt_utf8<wchar_t>); return utf8Local; }
可以将它设置给某个stream,而不是全局设置以免污染全局设置。
stream.imbue(Utf8Locale())
编码转换:
#ifdef _WIN32 std::string wstr2ansi(const std::wstring & wstr) { if (wstr.empty()) { return std::string(); } int byteCount = ::WideCharToMultiByte(CP_ACP, 0, &wstr[0], static_cast<int>(wstr.size()), nullptr, 0, nullptr, nullptr); std::string str(byteCount, 0); ::WideCharToMultiByte(CP_ACP, 0, &wstr[0], static_cast<int>(wstr.size()), &str[0], byteCount, nullptr, nullptr); return str; } #endif std::string wstr2utf8(const std::wstring & wstr) { static std::wstring_convert<std::codecvt_utf8<wchar_t>> strCnv; return strCnv.to_bytes(wstr); } std::wstring utf82wstr(const std::string & str) { static std::wstring_convert<std::codecvt_utf8<wchar_t>> strCnv; return strCnv.from_bytes(str); } #ifdef Q_OS_WIN static const char *gs_GBK_Locale_Name = ".936"; #else static const char *gs_GBK_Locale_Name = "zh_CN.GBK"; #endif std::string wstr2gbk(const std::wstring &wstr) { typedef std::codecvt_byname<wchar_t, char, std::mbstate_t> F; static std::wstring_convert<F> strCnv(new F(gs_GBK_Locale_Name)); return strCnv.to_bytes(wstr); } std::wstring gbk2wstr(const std::string &str) { typedef std::codecvt_byname<wchar_t, char, std::mbstate_t> F; static std::wstring_convert<F> strCnv(new F(gs_GBK_Locale_Name)); return strCnv.from_bytes(str); }