CString、string、wstring、utf-8互转
实现了一个CStrCvt类,主要进行宽字符和多字节相互转换,采用STL实现。注意的是,在多字节转宽字符(s2ws)和宽字符转多字节(ws2s)函数中需要locale信息,在使用过程中,需要根据实际情况进行设置。如果有需要可以检测文本编码,网上有开源的第三方库,可供使用。不过,准确率需自己判断。为了不影响效率,此类默认按照中文处理。
头文件
#include <string> #include <afxstr.h> #ifdef UNICODE typedef std::wstring tstring; #else typedef std::string tstring; #endif class CStrCvt { public: static std::string ts2s(const tstring& ts); static tstring s2ts(const std::string& s); static std::wstring ts2ws(const tstring& ts); static tstring ws2ts(const std::wstring& ws); static CString ts2cs(const tstring& ts); static tstring cs2ts(const CString& cs); static std::string ts2utf8(const tstring& ts); static tstring utf82ts(const std::string& utf8); static std::string s2utf8(const std::string& s); static std::string utf82s(const std::string& utf8); static std::string ws2utf8(const std::wstring& ws); static std::wstring utf82ws(const std::string& utf8); static std::wstring cs2ws(const CString& cs); static CString ws2cs(const std::wstring& wr); static std::string cs2s(const CString& cs); static CString s2cs(const std::string& s); static std::string cs2utf8(const CString& cs); static CString utf82cs(const std::string& s); static std::string ws2s(const std::wstring& ws/*, const std::string& locname = ("chs")*/); static std::wstring s2ws(const std::string& s/*, const std::string& locname = ("chs")*/); };
源文件
#include <codecvt> std::string CStrCvt::ws2utf8(const std::wstring& ws) { static std::wstring_convert<std::codecvt_utf8<wchar_t> > strCnv; return strCnv.to_bytes(ws); } std::wstring CStrCvt::utf82ws(const std::string& utf8) { static std::wstring_convert< std::codecvt_utf8<wchar_t> > strCnv; return strCnv.from_bytes(utf8); } std::string CStrCvt::s2utf8(const std::string& s) { return ws2utf8(s2ws(s)); } std::string CStrCvt::utf82s(const std::string& utf8) { return ws2s(utf82ws(utf8)); } 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& ws/*, const std::string& locname = ("chs")*/) { static std::wstring_convert<codecvt> converter/*(locname)*/; return converter.to_bytes(ws); } // ANSI to UTF-16 为了提升性能暂只支持中文 std::wstring CStrCvt::s2ws(const std::string& s/*, const std::string& locname = ("chs")*/) { static std::wstring_convert<codecvt> converter/*(locname)*/; return converter.from_bytes(s); } CString CStrCvt::s2cs(const std::string& s) { #ifdef UNICODE return s2ws(s).c_str(); #else return s.c_str(); #endif // UNICODE } CString CStrCvt::ws2cs(const std::wstring& ws) { #ifdef UNICODE return ws.c_str(); #else return ws2s(ws).c_str(); #endif // UNICODE } std::string CStrCvt::cs2s(const CString& cs) { #ifdef UNICODE return ws2s(cs.GetString()); #else return cs.GetString(); #endif // UNICODE } std::wstring CStrCvt::cs2ws(const CString& cs) { #ifdef UNICODE return cs.GetString(); #else return s2ws(cs.GetString()); #endif } std::string CStrCvt::cs2utf8(const CString& cs) { #ifdef UNICODE return ws2utf8(cs.GetString()); #else return s2utf8(cs.GetString()); #endif } CString CStrCvt::utf82cs(const std::string& utf8) { #ifdef UNICODE return utf82ws(utf8).c_str(); #else return utf82s(utf8).c_str(); #endif } std::string CStrCvt::ts2s(const tstring& ts) { #ifdef UNICODE return ws2s(ts); #else return ts; #endif } tstring CStrCvt::s2ts(const std::string& s) { #ifdef UNICODE return s2ws(s); #else return s; #endif } std::wstring CStrCvt::ts2ws(const tstring& ts) { #ifdef UNICODE return ts; #else return s2ws(ts); #endif } tstring CStrCvt::ws2ts(const std::wstring& ws) { #ifdef UNICODE return ws; #else return ws2s(ws); #endif } CString CStrCvt::ts2cs(const tstring& ts) { return ts.c_str(); } tstring CStrCvt::cs2ts(const CString& cs) { return cs.GetString(); } std::string CStrCvt::ts2utf8(const tstring& ts) { #ifdef UNICODE return ws2utf8(ts); #else return s2utf8(ts); #endif } tstring CStrCvt::utf82ts(const std::string& utf8) { #ifdef UNICODE return utf82ws(utf8); #else return utf82s(utf8); #endif }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)