街角_祝福

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

C++字符转码(GBK和UTF8)

std::string GBKToUtf8(const char* pSrc, int nLen)
{
    string strOut;
    if (pSrc && nLen > 0)
    {
        // ANSI -> UNICODE
        int wlen = MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)pSrc, nLen, NULL, 0);
        WCHAR* wszUtf8 = new WCHAR[wlen + 1];
        MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)pSrc, nLen, wszUtf8, wlen);

        // UNICODE -> UTF-8
        int len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, wlen, NULL, 0, NULL, NULL);
        char* szUtf8 = new char[len + 1];
        WideCharToMultiByte(CP_UTF8, 0, wszUtf8, wlen, szUtf8, len, NULL, NULL);
        strOut.assign(szUtf8, len);

        delete[] szUtf8;
        delete[] wszUtf8;
    }
    return strOut;
}

std::string Utf8ToGBK(const char* pSrc, int nLen)
{
    string strOut;
    if (pSrc && nLen > 0)
    {
        // UTF8 -> UNICODE
        int wlen = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)pSrc, nLen, NULL, 0);
        unsigned short* wszGBK = new unsigned short[wlen + 1];
        memset(wszGBK, 0, wlen * 2 + 2);
        MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)pSrc, nLen, (LPWSTR)wszGBK, wlen);

        // UNICODE -> GBK
        int len = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, wlen, NULL, 0, NULL, NULL);
        char* szGBK = new char[len + 1];
        memset(szGBK, 0, len + 1);
        WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, wlen, szGBK, len, NULL, NULL);
        strOut.assign(szGBK, len);

        delete[] szGBK;
        delete[] wszGBK;
    }
    return strOut;
}

posted on   街角_祝福  阅读(328)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示