标签 编码转换 下的文章

#include <codecvt>
#include <locale>

namespace std
{
    class codecvt_chs : public std::codecvt_byname<wchar_t, char, std::mbstate_t>
    {
    public:
        explicit codecvt_chs() : codecvt_byname("chs") 
    };
}

static bool U2W(const std::string& source, std::wstring& buffer)
{
    try
    {
        buffer.swap(*const_cast<std::wstring*>(std::addressof(static_cast<const std::wstring&>(std::wstring(std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes(source))))));
        return true;
    }
    catch (const std::range_error& ex)
    {
        printf("%s", ex.what());
    }

    return false;
}

static bool W2U(const std::wstring& source, std::string& buffer)
{
    try
    {
        buffer.swap(*const_cast<std::string*>(std::addressof(static_cast<const std::string&>(std::string(std::wstring_convert<std::codecvt_utf8<wchar_t>>().to_bytes(source))))));
        return true;
    }
    catch (const std::range_error& ex)
    {
        printf("%s", ex.what());
    }

    return false;
}

static bool A2W(const std::string& source, std::wstring& buffer)
{
    try
    {
        buffer.swap(*const_cast<std::wstring*>(std::addressof(static_cast<const std::wstring&>(std::wstring(std::wstring_convert<std::codecvt_chs>().from_bytes(source))))));
        return true;
    }
    catch (const std::range_error& ex)
    {
        printf("%s", ex.what());
    }
    return false;
}

static bool W2A(const std::wstring& source, std::string& buffer)
{
    try
    {
        buffer.swap(*const_cast<std::string*>(std::addressof(static_cast<const std::string&>(std::string(std::wstring_convert<std::codecvt_chs>().to_bytes(source))))));
        return true;
    }
    catch (const std::range_error& ex)
    {
        printf("%s", ex.what());
    }

    return false;
}

static bool U2A(const std::string& source, std::string& buffer)
{
    std::wstring temp;
    {
        if (U2W(source, temp) && W2A(temp, buffer))
        {
            return true;
        }
    }

    return false;
}

static bool A2U(const std::string& source, std::string& buffer)
{
    std::wstring temp;
    {
        if (A2W(source, temp) && W2U(temp, buffer))
        {
            return true;
        }
    }
    return false;
}