utf8 转 unicode

Sint32 str2wstr(PCSTR utf8, PWSTR unicode, Sint32 size)
{
int i = 0, u = 0;

SGL_MEMSET(unicode, 0, size);
while(utf8[i] && u < size - 2)
{
if((utf8[i] & 0x80) == 0)
{
// one byte 0...
unicode[u+1] = utf8[i++];
}else if((utf8[i] & 0x20) == 0){
// two bytes 110... 10...
unicode[u] = (UCHAR)((utf8[i]) & 0x1f) >> 2;
unicode[u+1] = ((UCHAR)((utf8[i]) & 0x1f) << 6) | (utf8[i+1] & 0x3f);
i+=2;
}else{
// three bytes 1110... 10... 10...
unicode[u] = ((utf8[i] & 0x0f) << 4) | ((utf8[i+1] & 0x3f) >> 2);
unicode[u+1] = (((utf8[i+1] & 0x3f) << 6)) | (utf8[i+2] & 0x3f);
i+=3;
}

u+=2;
}

return u;
}


Sint32 wstr2str(PCWSTR unicode, PSTR utf8, Sint32 size)
{
int u = 0, i = 0;

SGL_MEMSET(utf8, 0, size);
while((unicode[u] || unicode[u+1]) && i < size-1)
{
if(unicode[u] == 0 && unicode[u+1] < 128)
{
// 0 - 7 bits
utf8[i++] = unicode[u+1];
}else if((unicode[u] & 0xf8) == 0){
// 8 - 11 bits
utf8[i++] = 0xc0 | (unicode[u] << 2) | (unicode[u+1] >> 6);
utf8[i++] = 0x80 | (unicode[u+1] & 0x3f);
}else{
// 12 - 16 bits
utf8[i++] = 0xe0 | (unicode[u] >> 4);
utf8[i++] = 0x80 | ((unicode[u] & 0x0f) << 2) | (unicode[u+1] >> 6);
utf8[i++] = 0x80 | (unicode[u+1] & 0x3f);
}

u+=2;
}

return i;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值