Unicode UTF8 转换等

Unicode与UTF-8转换//

/*
*Unicode转换成UTF-8
*@param strUnicode: 待转换的CString
*@param szUtf8:转换后的UTF-8
*@return:返回UTF-8格式的长度
*/
int 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 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 CStrToChar(char* StrChar, const CString CStr)
{
 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 CharToCStr(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 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;
}

-------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------

linux

int code_convert(char *from_charset,char *to_charset,char **inbuf,size_t &inlen,char **outbuf,size_t &outlen)
{
    iconv_t cd; 
    int rc; 
    char **pin = inbuf;
    char **pout = outbuf;


    cd = iconv_open(to_charset,from_charset);
    if (cd==0) 
        return -1; 
    memset(*outbuf,0,outlen);
    if (iconv(cd,pin,&inlen,pout,&outlen)==-1) 
    {   
        switch(errno)
        {   
            case  E2BIG:
                printf("E2BiG\n");
            break;
            case  EILSEQ:
                printf("EILSEQ\n");
            break;
            case  EINVAL:
                printf("EINVAL\n");
            break;
        }   
        return -1; 
    }   
    iconv_close(cd);
    return 0;
}

调用:

char  szBuffer[4096] = {0};

char szTemp[6144] = {0};

size_t inlen=4096,outlen=6144;
char *in = szBuffer;

char *out = szTemp;
if(code_convert("UTF-16LE","UTF-8",(char **)&in,inlen,(char **)&out,outlen) == 0)
{
       string strTemp(szTemp);
       str += strTemp;
}

这是UNICODE(小端)转UTF8 示例,其他编码转换类似

最后返回的inlen outlen 是szBuffer 和szTemp 剩余 的空间

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值