c++ 编码转换 支持Linux 与Windows 系统

如果只想在Windows 平台下使用 可以参考 我的这篇文章
https://www.cnblogs.com/guolongzheng/p/13939527.html
代码片段

#pragma once
#include <string>
#include <codecvt>
#include <locale>
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
#define GBK_LOCALE ".936"
//Windows平台下 在visual studio 的 预处理中添加 宏定义 _SILENCE_ALL_CXX17_DEPRECATION_WARNINGS 否则会报错误
#else
#define GBK_LOCALE "zh_CN.GBK"
#endif
//为了兼容 Linux 系统下 析构函数不能设为 protected 问题
namespace std
{
	template<typename _InternT, typename _ExternT, typename _StateT>
	struct my_codecvt_byname : public codecvt_byname<_InternT, _ExternT, _StateT>
	{
		explicit my_codecvt_byname(const char* __s, long unsigned int __refs = 0): codecvt_byname<_InternT, _ExternT, _StateT>(__s, __refs){}
		explicit my_codecvt_byname(long unsigned int __refs = 0) : codecvt_byname<_InternT, _ExternT, _StateT>("C",__refs) {}
#if __cplusplus >= 201103L
		explicit my_codecvt_byname(const string& __s, long unsigned int __refs = 0):my_codecvt_byname(__s.c_str(), __refs) {}
#endif
		virtual ~my_codecvt_byname() { }
	};
}
namespace cool
{
	class Encoder {
	public:
		Encoder() = default;
		virtual ~Encoder() = default;
		inline std::string unicode_to_gbk(const std::wstring& str_value) {
			auto utf8_value = unicode_to_utf8(str_value);
			return utf8_to_gbk(utf8_value);
		}
		inline std::wstring gbk_to_unicode(const std::string& str_value) {
			auto gbk_value = gbk_to_utf8(str_value);
			return utf8_to_unicode(gbk_value);
		}
		inline std::string unicode_to_utf8(const std::wstring& str_value) {
			std::wstring_convert<std::codecvt_utf8<wchar_t>> conv;
			return conv.to_bytes(str_value);
		}
		inline std::wstring utf8_to_unicode(const std::string& str_value) {
			std::wstring_convert<std::codecvt_utf8<wchar_t>> conv;
			return conv.from_bytes(str_value);
		}
		inline std::string utf8_to_gbk(const std::string& str_value) {
			auto wstr_value = utf8_to_unicode(str_value);
			using utf8_and_gbk = std::my_codecvt_byname<wchar_t, char, std::mbstate_t>;

			std::wstring_convert<utf8_and_gbk> conv(new utf8_and_gbk(GBK_LOCALE));
			return conv.to_bytes(wstr_value);
		}
		inline std::string gbk_to_utf8(const std::string& str_value) {
			using utf8_and_gbk = std::my_codecvt_byname<wchar_t, char, std::mbstate_t>;
			std::wstring_convert<utf8_and_gbk> conv(new utf8_and_gbk(GBK_LOCALE));
			auto wstr_value = conv.from_bytes(str_value);
			std::wstring_convert<std::codecvt_utf8<wchar_t>> conv2;
			return conv2.to_bytes(wstr_value);
		}
	};
}
posted @ 2021-05-09 00:19  轻风々  阅读(517)  评论(0编辑  收藏  举报