utf-8 to unicode

一、utf-8 unicode utf-16

  • 1、unicode 使用两字节表示字符。
  • 2、utf-8 和 utf-16均为变长编码,使用1~4个字节来表示字符。
  • 3、utf-8 和 utf-16是不一样的,汉子使用 unicode 表示是两个字节,utf-8 是三个字节,utf-16 是两个字节。
  • 4、utf-8 只是 unicode的一种实现方式,类似的方式还有 utf-16 和 utf-32。
  • 5、Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。目前的Unicode字符分为17组编排,0x0000 至 0xFFFF,每组称为平面(Plane),而每平面拥有65536个码位,共1114112个。然而目前只用了少数平面。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。
  • 6、UCS-2用两个字节编码,UCS-4用4个字节编码。

二、utf-8 和 unicode 的对应关系

// #txt—
| Unicode符号范围 | UTF-8编码方式
n | (十六进制) | (二进制)
—+———————–+——————————————————
1 | 0000 0000 - 0000 007F | 0xxxxxxx
2 | 0000 0080 - 0000 07FF | 110xxxxx 10xxxxxx
3 | 0000 0800 - 0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
4 | 0001 0000 - 0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5 | 0020 0000 - 03FF FFFF | 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6 | 0400 0000 - 7FFF FFFF | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

// #txt—end

三、C语言实现 utf-8 to unicode

#include <stdio.h>
#include "stdint.h"

#define DLS_LEN     (uint8_t)129
#define DWBYTE(b3, b2, b1, b0) (((uint32_t)((uint8_t)(b3) << 24)) | ((uint8_t)(b2) << 16) | ((uint8_t)(b1) << 8) | ((uint8_t)(b0)))

void UTF8ToUnicode(uint8_t *UTF8,uint16_t *Unicode)
{
    uint16_t i=0,j=0;
    uint8_t buf[4];

    while(UTF8[i])
    {
        if((UTF8[i]&0x80)==0x00)
        {
            Unicode[j]=(uint16_t)DWBYTE(0,0,0,UTF8[i]);
            i+=1;
        }
        else if((UTF8[i]&0xe0)==0xc0)
        {
            buf[1]=(UTF8[i]&0x1c)>>2;
            buf[0]=(UTF8[i]<<6)|(UTF8[i+1]&0x3f);
            Unicode[j]=(uint16_t)DWBYTE(0,0,buf[1],buf[0]);
            i+=2;
        }
        else if((UTF8[i]&0xf0)==0xe0)
        {
            buf[1]=(UTF8[i]<<4)|((UTF8[i+1]&0x3c)>>2);
            buf[0]=(UTF8[i+1]<<6)|(UTF8[i+2]&0x3f);
            Unicode[j]=(uint16_t)DWBYTE(0,0,buf[1],buf[0]);
            i+=3;
        }
        else if((UTF8[i]&0xf8)==0xf0)
        {
            buf[2]=((UTF8[i]&0x07)<<2)|((UTF8[i+1]&0x30)>>4);
            buf[1]=((UTF8[i+1]&0x0f)<<4)|((UTF8[i+2]&0x3c)>>2);
            buf[0]=(UTF8[i+2]<<6)|(UTF8[i+3]&0x3f);
            Unicode[j]=(uint16_t)DWBYTE(0,buf[2],buf[1],buf[0]);
            i+=4;
        }
        else
        {
            Unicode[j] = (uint16_t)UTF8[i];
            i++;
        }
        if(Unicode[j]<0x20)
            Unicode[j]=0x20;
        j++;
        if(i>=(DLS_LEN-1))
            break;
    }
    if(j>=(DLS_LEN-1))
        Unicode[DLS_LEN-1]=0x00;
    else
        Unicode[j]=0x00;
}

int main()
{
    uint8_t xx=0;

    uint8_t utf8[256] = {0xE6,0xA2,0x81,0xE9,0x9D,0x99,0xE8,0x8C,0xB9};
    uint16_t unicode[256];

    UTF8ToUnicode(utf8,unicode);

    for(xx; xx<20; xx++)
    {
        printf("unicode[%d]:0x%x\n",xx,unicode[xx]);
    }
    return 0;
}
发布了119 篇原创文章 · 获赞 299 · 访问量 102万+
展开阅读全文

linux下utf8编码转Unicode编码

01-25

在网上找了转换的api只能转出一个汉字,怎么转整个字符串,以下是代码,希望各位大神指点一下 int Utf8ToUnicode(char* pInput, char* pOutput) { int outputSize = 0; //记录转换后的Unicode字符串的字节数 while (*pInput) { if (*pInput > 0x00 && *pInput <= 0x7F) //处理单字节UTF8字符(英文字母、数字) { *pOutput = *pInput; pOutput++; *pOutput = 0; //小端法表示,在高地址填补0 } else if (((*pInput) & 0xE0) == 0xC0) //处理双字节UTF8字符 { char high = *pInput; pInput++; char low = *pInput; if ((low & 0xC0) != 0x80) //检查是否为合法的UTF8字符表示 { return -1; //如果不是则报错 } *pOutput = (high << 6) + (low & 0x3F); pOutput++; *pOutput = (high >> 2) & 0x07; } else if (((*pInput) & 0xF0) == 0xE0) //处理三字节UTF8字符 { char high = *pInput; pInput++; char middle = *pInput; pInput++; char low = *pInput; if (((middle & 0xC0) != 0x80) || ((low & 0xC0) != 0x80)) { return -1; } *pOutput = (middle << 6) + (low & 0x3F);//取出middle的低两位与low的低6位,组合成unicode字符的低8位 pOutput++; *pOutput = (high << 4) + ((middle >> 2) & 0x0F); //取出high的低四位与middle的中间四位,组合成unicode字符的高8位 } else //对于其他字节数的UTF8字符不进行处理 { return -1; } pInput ++;//处理下一个utf8字符 pOutput ++; outputSize += 2; } //unicode字符串后面,有两个\0 *pOutput = 0; pOutput++; *pOutput = 0; return outputSize; } 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览