utf8 to unicode

#include <stdio.h>

#include <string.h>

#include <malloc.h>

#include <memory.h>

 

#ifdef WIN32

#define uint8_t  unsigned __int8

#define uint16_t unsigned __int16

#define uint32_t unsigned __int32

#define uint64_t unsigned __int64

 

#define int8_t  __int8

#define int16_t __int16

#define int32_t __int32

#endif

 

int unicode_to_utf8(uint16_t *in, int insize, uint8_t **out)

{

    int i = 0;

    int outsize = 0;

    int charscount = 0;

    uint8_t *result = NULL;

    uint8_t *tmp = NULL;

 

    charscount = insize / sizeof(uint16_t);

    result = (uint8_t *)malloc(charscount * 3 + 1);

    memset(result, 0, charscount * 3 + 1);

    tmp = result;

 

    for (i = 0; i < charscount; i++)

    {

        uint16_t unicode = in[i];

 

        if (unicode >= 0x0000 && unicode <= 0x007f)

        {

            *tmp = (uint8_t)unicode;

            tmp += 1;

            outsize += 1;

        }

        else if (unicode >= 0x0080 && unicode <= 0x07ff)

        {

            *tmp = 0xc0 | (unicode >> 6);

            tmp += 1;

            *tmp = 0x80 | (unicode & (0xff >> 2));

            tmp += 1;

            outsize += 2;

        }

        else if (unicode >= 0x0800 && unicode <= 0xffff)

        {

            *tmp = 0xe0 | (unicode >> 12);

            tmp += 1;

            *tmp = 0x80 | (unicode >> 6 & 0x00ff);

            tmp += 1;

            *tmp = 0x80 | (unicode & (0xff >> 2));

            tmp += 1;

            outsize += 3;

        }

 

    }

 

    *tmp = '/0';

    *out = result;

    return 0;

}

 

int utf8_to_unicode(uint8_t *in, uint16_t **out, int *outsize)

{

    uint8_t *p = in;

    uint16_t *result = NULL;

    int resultsize = 0;

    uint8_t *tmp = NULL;

 

    result = (uint16_t *)malloc(strlen(in) * 2 + 2); /* should be enough */

    memset(result, 0, strlen(in) * 2 + 2);

    tmp = (uint8_t *)result;

 

    while(*p)

    {

        if (*p >= 0x00 && *p <= 0x7f)

        {

            *tmp = *p;

            tmp++;

            *tmp = '/0';

            resultsize += 2;

        }

        else if ((*p & (0xff << 5))== 0xc0)

        {

            uint16_t t = 0;

            uint8_t t1 = 0;

            uint8_t t2 = 0;

 

            t1 = *p & (0xff >> 3);

            p++;

            t2 = *p & (0xff >> 2);

 

            *tmp = t2 | ((t1 & (0xff >> 6)) << 6);//t1 >> 2;

            tmp++;

 

            *tmp = t1 >> 2;//t2 | ((t1 & (0xff >> 6)) << 6);

            tmp++;

 

            resultsize += 2;

        }

        else if ((*p & (0xff << 4))== 0xe0)

        {

            uint16_t t = 0;

            uint8_t t1 = 0;

            uint8_t t2 = 0;

            uint8_t t3 = 0;

 

            t1 = *p & (0xff >> 3);

            p++;

            t2 = *p & (0xff >> 2);

            p++;

            t3 = *p & (0xff >> 2);

 

            //Little Endian

            *tmp = ((t2 & (0xff >> 6)) << 6) | t3;//(t1 << 4) | (t2 >> 2);

            tmp++;

 

            *tmp = (t1 << 4) | (t2 >> 2);//((t2 & (0xff >> 6)) << 6) | t3;

            tmp++;

            resultsize += 2;

        }

 

        p++;

    }

 

    *tmp = '/0';

    tmp++;

    *tmp = '/0';

    resultsize += 2;

 

    *out = result;

    *outsize = resultsize; 

    return 0;

}

 

void dump_utf8(uint8_t *utf8)

{

    uint8_t *p = utf8;

 

    while(*p)

    {

        printf("%02X", *p);

        p++;

    }

    putchar('/n');

}

 

void dump_unicode(uint16_t *utf16, int size)

{

    uint8_t *p = (uint8_t *)utf16;

    int i = 0;

 

    for (i = 0; i < size; i++)

    {

        printf("%02X", *p);

        p++;

    }

    putchar('/n');

}

 

int main()

{

    uint16_t unicode[] = L"中文";

    uint8_t *utf8 = NULL;

 

    int unisize = 0;

    uint16_t *uni = NULL;

 

    printf("original unicode: /n");

    dump_unicode(unicode, sizeof(unicode));

 

    printf("converted to utf8: /n");

    unicode_to_utf8(unicode, sizeof(unicode), &utf8);

    dump_utf8(utf8);

 

    printf("converted to unicode: /n");

    utf8_to_unicode(utf8, &uni, &unisize);

    dump_unicode(uni, unisize);

 

    free(utf8);

    free(uni);

 

    return 0;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值