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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#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;
}