Unicode UTF8 VC 文件

本文详细介绍了多种字符编码之间的转换方法,包括Unicode与UTF-8、GBK与UTF-8之间的相互转换,以及如何在不同编码环境下进行CString与Char*的转换等。通过具体的代码示例,帮助读者理解并实现各种场景下的编码转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Unicode与UTF-8转换//

/*
*Unicode转换成UTF-8
*@param strUnicode: 待转换的CString
*@param szUtf8:转换后的UTF-8
*@return :返回UTF-8格式的长度
*/
int CImpIEFav::UniToUTF8(CString strUnicode,char *szUtf8)
{
 //MessageBox(strUnicode);
 int ilen = WideCharToMultiByte(CP_UTF8, 0, (LPCTSTR)strUnicode, -1, NULL, 0, NULL, NULL); 
 char *szUtf8Temp=new char[ilen + 1];
    memset(szUtf8Temp, 0, ilen +1); 
    WideCharToMultiByte (CP_UTF8, 0, (LPCTSTR)strUnicode, -1, szUtf8Temp, ilen, NULL,NULL); 
 //size_t a = strlen(szUtf8Temp);
 sprintf(szUtf8, "%s", szUtf8Temp);// 
    delete[] szUtf8Temp; 
 return ilen;
}
/*
*UTF-8转换成Unicode
*@param UTF8: 待转换的的UTF-8
*@return :返回Unicode格式的字符串
*/
CString CImpIEFav::UTF8ToUni(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,pwText,dwUnicodeLen);
 //转为CString
 strUnicode.Format(_T("%s"),pwText);
 //清除内存
 delete []pwText;
 //返回转换好的Unicode字串
 return strUnicode;
}

UNICODE下 CString与 Char*转换///

/*
*UNICODE下 CString转换成Char*
*@param StrChar: 转换后的char*
*@param CStr:待转换的CString
*@param CharLen:Char数组的长度
*/
void CImpIEFav::ConvertCStrToChar(char* StrChar, const CString CStr, int CharLen)
{
 char* pTargetData = NULL;
 int   targetLen=WideCharToMultiByte(CP_ACP,0,CStr,-1,pTargetData,0,NULL,NULL);                                      
 pTargetData = new char[targetLen+1];                      
 memset(pTargetData,0,targetLen+1);                                  
 WideCharToMultiByte(CP_ACP,0,CStr,-1,pTargetData,targetLen,NULL,NULL);   
 sprintf(StrChar, "%s", pTargetData);// CharLen:.net才需要CharLen作为第二个参数
 delete []pTargetData;
}

//UNICODE下 Char*转换成CString

//功能:将char* 转换为CString
//参数:待转换的char*
//返回值:转换后的CString
CString CCommon::charToCString(char* result)
{
    //将char 转换为 CString字符
    DWORD dwNum = MultiByteToWideChar(CP_ACP, 0, result, -1, NULL, 0);
    wchar_t *pwText;
    pwText = new wchar_t[dwNum];
    if(!pwText)
    {
        delete []pwText;
        return _T("");//暂时这样处理
    }
    MultiByteToWideChar (CP_ACP, 0, result, -1, pwText, dwNum);// 开始转换
    CString cstr=pwText;
    return cstr;
}

//UNICODE 转 urlencode//

//szEncode为utf8格式
//即要先转为UTF8才能转为urlencode
CString CBandToolBarCtrl::UniToUrlEncode(const char* szEncode)
{
    CString strEncoded;
    static const char szUnsafe[] = {"/"<>%//^[]`+$,@:;/!#?=&"};
    static const char szHexChr[] = {"0123456789ABCDEF"};
    int nLength = strlen(szEncode);
    
    for(int i = 0; i < nLength; i++)
    {
        TCHAR ch = szEncode[i];
        
        if((NULL == strchr(szUnsafe, ch))
            && ((int)ch > 32)
            && ((int)ch < 123))
        {
            strEncoded += ch;
        }
        else
        {
            strEncoded += CString("%");
            strEncoded += szHexChr[(int)((ch >> 4) & 0x0f)];
            strEncoded += szHexChr[(int)(ch & 0x0f)];
        }
    }
    return strEncoded;
}

使用范例:

WCHAR *pbstrLocationURL = new WCHAR[MAX_PATH];

char szUrlTemp[MAX_PATH*3]={0};
UniToUTF8(pbstrLocationURL,szUrlTemp);
CString strUrl = UniToUrlEncode(szUrlTemp);

/GBK 与 Utf8转换

/*
*GBK格式转Utf8格式*
*@param strGBK: 待转换的GBK CString
*转换完成后,为Utf8 CString
*/
void General::ConvertGBKToUtf8(CString& strGBK) 
{
    int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
    unsigned short * wszUtf8 = new unsigned short[len+1];
    memset(wszUtf8, 0, len * 2 + 2);
    MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, wszUtf8, len);

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

    strGBK = szUtf8;
    delete[] szUtf8;
    delete[] wszUtf8;
}
/*
*Utf8格式转GBK格式*
*@param strGBK: 待转换的Utf8 CString
*转换完成后,为GBK CString
*/
void General::ConvertUtf8ToGBK(CString& strUtf8) 
{
    int len=MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL,0); 
    unsigned short * wszGBK = new unsigned short[len+1];
    memset(wszGBK, 0, len * 2 + 2);
    MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, wszGBK, len);

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值