Unicode和UTF-8/16/32关系详解

作为刚接触编程的小萌新,涉及编码的时候总是遇到Unicode和UTF-8这两个词,甚是疑惑。于是百度了一下,在此做个整理,也顺便分享自己的一个理解。
第一:字符要编码。给世界上的每一个字符一对一匹配一个二进制码,以用作字符在计算机上的处理。
第二:世界上有两个组织来实现了这个方案。
1)ISO组织提出了UCS(通用字符集),软件制造商们提出的Unicode(统一码)
2)UCS分为UCS-2和UCS-4,分别代表使用两个字节和四个字节来编码一个字符。
第一个字节是(组),第二个字节是(平面),第三个字节是(行),第四个字节是(列)
当最高的两个字节均为0的时候,UCS-4变为UCS-2。
3)Unicode使用3个字节来编码一个字符。第一个字节相当于UCS-4的(平面),第二个字节相当于UCS-4的(行),第三个字节相当于UCS-4的(列)。目前Unicode计划使用17个平面来编码字符,十六进制表示的范围是000000-10FFFF,共可表示1114112个字符。目前使用了平面是0、1、2、14、15、16共6个平面,已定义码位238605个
4)那么字符的Unicode编码是如何保存到计算机当中的呢?最常见是采用UTF-8编码方案。目前Unicode编码最长是21位,最短是7位。UTF-8编码方案针对不同位数长度的Unicode编码采用不同的字节来表示。为了让计算机在进行二进制的识别的时 候能区分出边界,所以UTF-8编码实现方案采用了
0XXXXXXX(7位)
10XXXXXX(6位)
110XXXXX(5位)
1110XXXX(4位)
11110XXX(3位)
这几个字节模板作为计算机的识别边界。7位模板用作和ASCII码进行一对一匹配, 6位模板可表位数第二多,因此作为常用模板来存储编码位数。为了节省编码占用的储存空间,6位常用模板需要逐一增加。为了区分使用1/2/3 个6位常用模板,另外使用5位/4位/3位模板作为边界进行区分,方便计算机进行识别。因此有一下常用模板来存储Unicode编码:
000000-00007F 0XXXXXXX(可表7位)
000080-0007FF 110XXXXX 10XXXXXX(可表11位)
0008FF-00FFFF 1110XXXX 10XXXXXX 10XXXXXX(可表16位)
010000-10FFFF 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX(可表21位)

5)Unicode的第二个编码实现方案是UTF-16。使用16位长度的无符号整数保存Unicode 编码。因此长度在16位以下的Unicode编码可以直接被保存。
长度超过16位的Unicode字符则计算出其超过16位的增量部分,然后储存在可表位数20位的4字节模板里面。
因此:
000000-00FFFF XXXX XXXX XXXX XXXX(可表16位)
010000-10FFFF 110110XX XXXX XXXX 110111XX XXXX XXXX(可表20位)
(D800 - DBFF) (DC00-DFFF)

UTF-16方案的实现需要一个前提条件,那就是Unicode编码在BMP(0平面)需要划 出一个保留区D800-DFFF,不分配码位,使得UTF-16在编码16位以下的Unicode编 码的时候不会和使用4字节模板的UTF-16编码产生冲突。

6)UTF-32的编码实现方案没什么好说,因为可表位数有32位,所以直接与Unicode编码 一一对应。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值