看流星社区

 找回密码
 注册账号
查看: 2086|回复: 0

VC++的UNICODE工程一些常用转码

[复制链接]

该用户从未签到

发表于 2015-4-4 20:37:52 | 显示全部楼层 |阅读模式
void CServerSession::CString2Char(CString str, char ch[])
{
        int wLen = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL);//得到Char的长度
        WideCharToMultiByte(CP_ACP, 0, str, -1, ch, wLen, NULL, NULL);       //将CString转换成char*
}

void CServerSession::ConvertUtf8ToGBK(CString& strUtf8)
{
        //UNICODE编码下强制将wchar_t*转成char*
        int len=MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)(LPCTSTR)strUtf8, -1, NULL,0);
        unsigned short * wszGBK = new unsigned short[len+1];
        memset(wszGBK, 0, len * 2 + 2);
        //多字符集下不用强制转成char*
        //MultiByteToWideChar(CP_UTF8, 0,(LPCTSTR)strUtf8, -1, (LPWSTR)wszGBK, len);
        MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)(LPCTSTR)strUtf8, -1, (LPWSTR)wszGBK, len);

        len = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, NULL, 0, NULL, NULL);
        char *szGBK=new char[len + 1];
        ::memset(szGBK, 0, len + 1);
        WideCharToMultiByte (CP_ACP, 0,(LPWSTR)wszGBK, -1, szGBK, len, NULL,NULL);

        strUtf8 = szGBK;
        delete[] szGBK;
        delete[] wszGBK;
}

void CServerSession::ConvertGBKToUtf8(CString& strGBK)
{
        int len=MultiByteToWideChar(CP_ACP, 0, (LPCSTR)(LPCTSTR)strGBK, -1, NULL,0);
        unsigned short * wszUtf8 = new unsigned short[len+1];
        memset(wszUtf8, 0, len * 2 + 2);
        MultiByteToWideChar(CP_ACP, 0, (LPCSTR)(LPCTSTR)strGBK, -1, (LPWSTR)wszUtf8, len);

        len = WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)wszUtf8, -1, NULL, 0, NULL, NULL);
        char *szUtf8=new char[len + 1];
        ::memset(szUtf8, 0, len + 1);
        WideCharToMultiByte (CP_UTF8, 0, (LPWSTR)wszUtf8, -1, szUtf8, len, NULL,NULL);

        strGBK = szUtf8;
        delete[] szUtf8;
        delete[] wszUtf8;
}

char *CServerSession::UnicodeToUtf8(CString unicode)
{
        int u8Len = ::WideCharToMultiByte(CP_UTF8, NULL, unicode, (DWORD)wcslen(unicode), NULL, 0, NULL, NULL);
        //同上,分配空间要给'\0'留个空间
        //UTF8虽然是Unicode的压缩形式,但也是多字节字符串,所以可以以char的形式保存
        char* szU8 = new char[u8Len + 1];
        //转换
        //unicode版对应的strlen是wcslen
        ::WideCharToMultiByte(CP_UTF8, NULL, unicode, (DWORD)wcslen(unicode), szU8, u8Len, NULL, NULL);
        //最后加上'\0'
        szU8[u8Len] = '\0';
        return szU8;
}

char *CServerSession::UnicodeToAscii(CString unicode)
{
        int ansiLen = ::WideCharToMultiByte(CP_ACP, NULL, unicode, (DWORD)wcslen(unicode), NULL, 0, NULL, NULL);
        //同上,分配空间要给'\0'留个空间
        char* szAnsi = new char[ansiLen + 1];
        //转换
        //unicode版对应的strlen是wcslen
        ::WideCharToMultiByte(CP_ACP, NULL, unicode, (DWORD)wcslen(unicode), szAnsi, ansiLen, NULL, NULL);
        //最后加上'\0'
        szAnsi[ansiLen] = '\0';
        return szAnsi;
}

/*
LPCSTR   是const   char*
LPCTSTR   是const   wchar_t   *
*/

CString CServerSession::UTF8ToUnicode(char* UTF8)
{
        DWORD dwUnicodeLen;        //转换后Unicode的长度
        TCHAR *pwText;            //保存Unicode的指针
        CString strUnicode;        //返回值
        //获得转换后的长度,并分配内存
        dwUnicodeLen = MultiByteToWideChar(CP_UTF8,0,UTF8,-1,NULL,0);
        pwText = new TCHAR[dwUnicodeLen];
        if (!pwText){
                return strUnicode;
        }
        //转为Unicode
        MultiByteToWideChar(CP_UTF8,0,UTF8,-1,(LPWSTR)pwText,dwUnicodeLen);
        //转为CString
        strUnicode.Format(_T("%s"),pwText);
        //清除内存
        delete []pwText;
        //返回转换好的Unicode字串
        return strUnicode;
}
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-25 15:19

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表