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
}

 

posted @ 2023-12-12 15:31  快雪  阅读(237)  评论(0编辑  收藏  举报