编码处理相关
获取一个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);
}