UTF-8编解码之实现

根据对UTF8编码格式的研究,作出如下的简单的实现代码,希望大家指正批评并继续完善:

int  WideCharToUTF8(wchar_t *  source,  int  sourceLen, unsigned  char *  dest,  int &  destLen)
{
 destLen 
= 0;
 
if (sourceLen <= 0)
 
{
  
return destLen = 0;
 }

 wchar_t
* p = source;
 
for (int i = 0; i < sourceLen; ++i)
 
{
  
if (p[i] <= 0x7F)//0111,0000
  {
   
if(dest)
    
*dest++ = static_cast<unsigned char>(p[i]);
   destLen
++;
  }

  
else if (p[i] <= 0x7FF)//11111,111111
  {
   
if (dest)
   
{
    
*dest++ = 0xC0 + static_cast<unsigned char>((p[i] & 0xFFC0>> 6);
    
*dest++ = 0x80 + static_cast<unsigned char>(p[i] & ~0xFFC0);
   }
   
   destLen
+=2;
  }

  
else if (p[i] <= 0xFFFF)//1111,111111,111111
  {
   
if (dest)
   
{
    
*dest++ = 0xE0 + static_cast<unsigned char>((p[i] & 0xF000>> 12);
    
*dest++ = 0x80 + static_cast<unsigned char>((p[i] & 0x0FC0>> 6);
    
*dest++ = 0x80 + static_cast<unsigned char>(p[i] & ~0xFFC0);
   }
   
   destLen
+=3;
  }

 }

 
return destLen;
}
 

int  UTF8ToWideChar(unsigned  char   * source,  int  sourceLen, wchar_t *  dest,  int &  destLen)
{
 destLen 
= 0;
 
if (sourceLen <= 0)
 
{
  
return destLen = 0;
 }

 unsigned 
char* p = source;
 
for (int i = 0; i < sourceLen; ++i)
 
{
  
if ((p[i] & 0x80== 0)
  
{
   
if (dest)
    
*dest++ = static_cast<wchar_t>(p[i]);   
  }

  
else if ((p[i] & 0xE0== 0xC0)
  
{
   
if (dest)
    
*dest++ = (static_cast<wchar_t>(p[i] & 0x1F<< 6)
     
+ static_cast<wchar_t>(p[i+1& 0x7F);
   
++i;
  }

  
else if ((p[i] & 0xF0== 0xE0)
  
{
   wchar_t x;
   
if (dest)
   
{
    
*dest++ = (static_cast<wchar_t>(p[i] & 0x0F<< 12)
     
+ (static_cast<wchar_t>(p[i+1& 0x7F<< 6)
     
+ static_cast<wchar_t>(p[i+2& 0x7F);
   }

   i
+=2;
  }

  
++destLen;
 }

 
return destLen;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值