C++语言string、wstring、utf-8互转

发布时间 2023-12-12 15:31:51作者: 快雪

实现了一个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);
}