UNICODE 与 UTF8 的相互转换 (c++)版

网上找了半天,很麻烦,最后弄得了贴出来方便大家:

 

void  UnicodeToUtf8( char   * utf8) 
... {
 
int len = 0;
 
int size_d = 8;
 DWORD dwNum 
= MultiByteToWideChar (CP_ACP, 0, utf8, -1, NULL, 0);
 wchar_t 
*wchar;
 wchar 
= new wchar_t[dwNum];
  
if(!wchar)
  
...{
   delete []wchar;
  }

 MultiByteToWideChar (CP_ACP, 
0,utf8, -1, wchar, dwNum);
 
for(int i = 0; i <dwNum; i++)
 
...{
    
if ((wchar[i]) < 0x80)
    
...{  //
    utf8[len++= (char)(wchar[i]);
    }

    
else if((wchar[i]) < 0x800)
    
...{
    utf8[len
++= 0xc0 | ( (*wchar) >> 6 );
    utf8[len
++= 0x80 | ( (*wchar) & 0x3f );
    }

    
else if((wchar[i]) < 0x10000 )
    
...{
        utf8[len
++= 0xE0 | ((wchar[i]) >> 12);
        utf8[len
++= 0x80 | (((wchar[i])>>6& 0x3F);
        utf8[len
++= 0x80 | ((wchar[i]) & 0x3F);  
    }

    
else if((wchar[i]) < 0x200000 ) 
    
...{
    utf8[len
++= 0xf0 | ( (int)(wchar[i]) >> 18 );
    utf8[len
++= 0x80 | ( ((wchar[i]) >> 12& 0x3f );
    utf8[len
++= 0x80 | ( ((wchar[i]) >> 6& 0x3f );
    utf8[len
++= 0x80 | ( (wchar[i]) & 0x3f );
    }

 }

}

CString UTF8toUnicode(
char   * s)
... {
int len = 0
WCHAR
* r = new WCHAR[strlen(s) * 2]; 
    
while(s[0]) 
    
...
        
int bytes = 1
        
if(s[0& 0x80
        
while(s[0& (0x80 >> bytes)) bytes++
        
if(bytes == 1
            r[len] 
= s[0]; 
        
else 
        
...
            r[len] 
= 0
            
for(char*= s + (bytes - 1); p > s; p--
            r[len] 
|= ((*p) & 0x3F<< ((bytes - (p - s) - 1* 6); 
            r[len] 
|= (s[0& ((1 << (7 - bytes)) - 1)) << ((bytes - 1* 6); 
        }
 
        len
++
        s 
+= bytes; 
    }
 
    r[len] 
= 0
    
char*buffer = new char[len * 2 + 1]; 
 ZeroMemory(buffer, len 
* 2 + 1); 
 ::WideCharToMultiByte(CP_ACP, NULL, r, len, buffer, 
1+ 2 * len, NULL, NULL); 
 CString str 
= buffer; 
 delete[] r; 
 delete[] buffer; 
return str; 
}

 能用 具体再自己改

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值