UTF-8 转 Unicode

int UTF2Uni(const char* src, AECHAR *&t)
{
 if (src == NULL)
 {
  return -1;
 }

 int size_s = STRLEN(src);
 int size_d = size_s*2 +1;          //?
 
 AECHAR *des = new AECHAR[size_d];
 MEMSET(des, 0, size_d * sizeof(AECHAR));
 
 int s = 0, d = 0;
 bool toomuchbyte = true; //set true to skip error prefix.
 
 while (s < size_s && d < size_d)
 {
  unsigned char c = src[s];
  if ((c & 0x80) == 0)
  {
   des[d++] += src[s++];
  }
  else if((c & 0xE0) == 0xC0)  ///< 110x-xxxx 10xx-xxxx
  {
   AECHAR &wideChar = des[d++];
   wideChar  = (src[s + 0] & 0x3F) << 6;
   wideChar |= (src[s + 1] & 0x3F);
  
   s += 2;
  }
  else if((c & 0xF0) == 0xE0)  ///< 1110-xxxx 10xx-xxxx 10xx-xxxx
  {
   AECHAR &wideChar = des[d++];
  
   wideChar  = (src[s + 0] & 0x1F) << 12;
   wideChar |= (src[s + 1] & 0x3F) << 6;
   wideChar |= (src[s + 2] & 0x3F);
  
   s += 3;
  }
  else if((c & 0xF8) == 0xF0)  ///< 1111-0xxx 10xx-xxxx 10xx-xxxx 10xx-xxxx
  {
   AECHAR &wideChar = des[d++];
  
   wideChar  = (src[s + 0] & 0x0F) << 18;
   wideChar  = (src[s + 1] & 0x3F) << 12;
   wideChar |= (src[s + 2] & 0x3F) << 6;
   wideChar |= (src[s + 3] & 0x3F);
  
   s += 4;
  }
  else
  {
   AECHAR &wideChar = des[d++]; ///< 1111-10xx 10xx-xxxx 10xx-xxxx 10xx-xxxx 10xx-xxxx
  
   wideChar  = (src[s + 0] & 0x07) << 24;
   wideChar  = (src[s + 1] & 0x3F) << 18;
   wideChar  = (src[s + 2] & 0x3F) << 12;
   wideChar |= (src[s + 3] & 0x3F) << 6;
   wideChar |= (src[s + 4] & 0x3F);

   s += 5;
  }
 }
 
 t = des;
// delete[] des;   //care here
 des = NULL;
 
 return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值