UTF8与Unicode互转

int UTF8ToUnicode(const char* utf8, wchar_t *unicode)
{
    char b1,b2,b3;
    int unicSize = 0;
    const char* p = utf8;
    char* tmp = (char *)unicode;
    while(*p)
    {
        if(*p >= 0x00 && *p <= 0x7F)
        {
            *tmp = *p;
            tmp++;
            tmp++;
            unicSize += 1;
        }
        /* 110xxxxx 10xxxxxx*/
        else if((*p & 0xE0) == 0xC0)
        {
            b1 = *p;
            p++;
            b2 = *p;
            *tmp = (b1 << 6) | (b2 & 0x3F);
            tmp++;
            *tmp = (b1 >> 2) & 0x07;
            tmp++;
            unicSize += 1;
        }
        /* 1110xxxx 10xxxxxx 10xxxxxx */
        else if((*p & 0xF0) == 0xE0)
        {
            b1 = *p;
            p++;
            b2 = *p;
            p++;
            b3 = *p;
            *tmp = (b2 << 6) | (b3 & 0x3F);
            tmp++;
            *tmp = (b1 << 4) | ((b2 >> 2) & 0x0F);
            tmp++;
            unicSize += 1;
        }
        p++;
    }
    *tmp = '\0';
    tmp++;
    *tmp = '\0';
    return unicSize;
}
 

int UnicodeToUTF8(char* dest, int destSize, const wchar_t* src, int srcSize)
{
    char * u8 = dest;
    char * u8_max = u8 + size;
    const wchar_t * u2 = src;
    const wchar_t * u2_max = src + srclen;
    while ((u2 < u2_max) && (u8 < u8_max)) {
        if ((*u2) >= 0x00 && (*u2) <= 0x7F)
        {
            *u8 = (*u2) & 0x7F;
            u8++;
        }
        else if ((*u2) >= 0x80 && (*u2) <= 0x07FF)
        {
            *u8 = 0xC0 | (((*u2) >> 6) & 0x1F);
            u8++;
            *u8 = 0x80 | ((*u2) & 0x3F);
            u8++;
        }
        else if ((*u2) >= 0x0800 && (*u2) <= 0xFFFF)
        {
            *u8 = 0xE0 | (((*u2)>>12) & 0x0F);
            u8++;
            *u8 = 0x80 | (((*u2) >> 6) & 0x3F);
            u8++;
            *u8 = 0x80 | ((*u2) & 0x3F);
            u8++;
        }
        u2++;
    }
    *u8 = '\0';
    return (u8-dest);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值