美文网首页
C++ 字符串编码转换

C++ 字符串编码转换

作者: _smoking_ | 来源:发表于2019-05-10 17:39 被阅读0次

    ​ 最近碰到字符串编码转换的问题,简单记录下

    utf8 转 unicode

    std::wstring UTF8ToWide(const std::string& source)
    {
        std::wstring_convert<std::codecvt_utf8<wchar_t>> conv;
        return conv.from_bytes(source);
    }
    

    unicode 转 utf8

    std::string WideToUTF8(const std::wstring& source)
    {
        std::wstring_convert<std::codecvt_utf8<wchar_t>> conv;
        return conv.to_bytes(source);
    }
    

    utf8 转 utf16

    std::u16string UTF8ToUTF16(const std::string& source)
    {
        #if defined(OS_WIN)
        #if _MSC_VER >= 1900
        std::wstring_convert<std::codecvt_utf8_utf16<int16_t>, int16_t> conv;
        auto begin_pos = reinterpret_cast<const int8_t*>(source.data());
        return (char16_t*)conv.from_bytes((char*)begin_pos, (char*)(begin_pos + source.size())).c_str();
        #else
        std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> conv;
        return conv.from_bytes(source);
        #endif
        #else
        std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> conv;
        return conv.from_bytes(source);
        #endif
    }
    

    utf16 转 utf8

    std::string UTF16ToUTF8(const std::u16string& source)
    {
        #if defined(OS_WIN)
        #if _MSC_VER >= 1900
        std::wstring_convert<std::codecvt_utf8_utf16<int16_t>, int16_t> conv;
        auto begin_pos = reinterpret_cast<const int16_t*>(source.data());
        return conv.to_bytes(begin_pos, begin_pos + source.size());
        #else
        std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> conv;
        return conv.to_bytes(source);
        #endif
        #else
        std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> conv;
        return conv.to_bytes(source);
        #endif
    }
    

    Ascii 转unicode

    std::wstring AsciiToWide(std::string _strSrc)
    {
        int unicodeLen = MultiByteToWideChar(CP_ACP, 0, _strSrc.c_str(), -1, nullptr, 0);
        wchar_t *pUnicode = (wchar_t*)malloc(sizeof(wchar_t)*unicodeLen);
        MultiByteToWideChar(CP_ACP, 0, _strSrc.c_str(), -1, pUnicode, unicodeLen);
        std::wstring ret_str = pUnicode;
        free(pUnicode);
        return ret_str;
    }
    

    unicode 转 Ascii

    std::string WideToAscii(std::wstring _strSrc)
    {
        int ansiiLen = WideCharToMultiByte(CP_ACP, 0, _strSrc.c_str(), -1, nullptr, 0, nullptr, nullptr);
        char *pAssii = (char*)malloc(sizeof(char)*ansiiLen);
        WideCharToMultiByte(CP_ACP, 0, _strSrc.c_str(), -1, pAssii, ansiiLen, nullptr, nullptr);
        std::string ret_str = pAssii;
        free(pAssii);
        return ret_str;
    }
    

    utf8 转 Ascii

    std::string UTF8ToAscii(std::string _strSrc)
    {
        return WideToAscii(UTF8ToWide(_strSrc));
    }
    

    Ascii 转 utf8

    std::string AsciiToUTF8(std::string _strSrc)
    {
        return WideToUTF8(AsciiToWide(_strSrc));
    }
    

    深圳利程电子有限公司

    相关文章

      网友评论

          本文标题:C++ 字符串编码转换

          本文链接:https://www.haomeiwen.com/subject/vvzaoqtx.html