实现了一个CStrCvt类,采用STL实现,可跨平台。注意的是,在s2ws和ws2s函数中需要locale信息,在使用过程中,需要根据实际情况进行设置。如果有需要可以检测文本编码,网上有开源的第三方库,可供使用。不过,准确率需自己判断。为了不影响效率,此类默认按照中文处理。
头文件
class CStrCvt { public: static std::string ws2utf8(const std::wstring& str); static std::wstring utf82ws(const std::string& str); static std::string s2utf8(const std::string& str); static std::string utf82s(const std::string& str); static std::string ws2s(const std::wstring& str/*, const std::string& locname = ("chs")*/); static std::wstring s2ws(const std::string& str/*, const std::string& locname = ("chs")*/); };
源文件
#include <codecvt> std::string CStrCvt::ws2utf8(const std::wstring& str) { static std::wstring_convert<std::codecvt_utf8<wchar_t> > strCnv; return strCnv.to_bytes(str); } std::wstring CStrCvt::utf82ws(const std::string& str) { static std::wstring_convert< std::codecvt_utf8<wchar_t> > strCnv; return strCnv.from_bytes(str); } std::string CStrCvt::s2utf8(const std::string& str) { return ws2utf8(s2ws(str)); } std::string CStrCvt::utf82s(const std::string& str) { return ws2s(utf82ws(str)); } class codecvt:public std::codecvt_byname<wchar_t, char, std::mbstate_t> { public: codecvt() : codecvt_byname("chs") { } codecvt(const std::string& locname) : codecvt_byname(locname) { } ~codecvt() {} }; // UTF-16 to ANSI 为了提升性能暂只支持中文 std::string CStrCvt::ws2s(const std::wstring& str/*, const std::string& locname = ("chs")*/) { static std::wstring_convert<codecvt> converter/*(locname)*/; return converter.to_bytes(str); } // ANSI to UTF-16 为了提升性能暂只支持中文 std::wstring CStrCvt::s2ws(const std::string& str/*, const std::string& locname = ("chs")*/) { static std::wstring_convert<codecvt> converter/*(locname)*/; return converter.from_bytes(str); }
标签:std,utf,string,C++,wstring,static,str,互转,const From: https://www.cnblogs.com/kuaixue/p/17897035.html