编码处理相关

获取一个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);
}

 

发表回复