编码字符集Unicode与字符编码UTF-8,UTF-16,UTF-32

编码字符集Unicode与字符编码UTF-8,UTF-16,UTF-32

这些名词应该大家都接触过很多次,但是更能没有真正去去了解研究过,今天查了查资料,大概是弄明白了这几个东西的关系

主要参考资料:资料1资料2

首先我们要明白三个概念:字符集,代码点,编码字符集,字符编码

1. 三个概念

1.1 字符集(character set)

我们选取字符的集合就构成了一个字符集,比如所有的英文字母,所有的汉字就构成了一个字符集。

1.2 代码点(code point or code position)

对字符集中的每个字符都进行编号,则每个字符对应的编号值就是其代码点

1.3 编码字符集(coded character set)

对字符集中的每个字符都进行编号,则编号之后的字符集就称为编码字符集。比如常见的编码字符集有ASCII,Unicode,GBK等等

1.4 字符编码(character encoding form)

字符编码就是将字符集中的代码点按照某种规则转化为可以在计算机内部存储的二进制比特序列,就是建立一种转化关系或者映射关系。

那么我们前面的编码字符集不就是一种映射关系吗?确实是的,但是存储在计算机内部时不一定就是按照其序号值(即代码点)直接存储的,甚至一个字符集对应着多种编码方式(如Unicode),当然也有直接将序号值(代码点)直接作为字符编码直接存储的(如ASCII)

2. 具体应用

2.1 Unicode

Unicode字符集由多语言软件制造商组成的统一码联盟(Unicode Consortium)与国际标准化组织的ISO-10646工作组制订,为各种语言中的每个字符指定统一且唯一的代码点,以满足跨语言、跨平台转换和处理文本的要求。

Unicode代码点范围为0x00x10FFFF,共计1114112个代码点,划分为编号016的17个字符平面,每个平面包含65536个代码点(即两个字节)。其中编号为0的平面最为常用,称为基本多语种平面(Basic Multilingual Plane, BMP);其他平面则称为辅助语言平面。

Unicode通常用 U+xxxx 表示(x为16进制)

编码字符集有了,我们就需要将字符存入计算机了,Unicode存入计算机的具体字符编码方案UTF(unicode transformation format)就有三种:

  • UTF-8(变长编码)
  • UTF-16(变长编码)
  • UTF-32(等长编码)

2.2 UTF-32

如何将Unicode保存在计算机呢?

当然最直接的想法就是等职转化,每个字符就用其代码点数值完整的保存在计算机中(就像ASCII那样),于是就有了UTF-32(表示全部1114112个代码点需要4个字节),但是其空间效率较低(许多字符使用较少),因此应用不是十分广泛。

2.3 UTF-16

前面我们提到了Unicode基本多语种平面(最常用)包含65536个代码点,只需要2个字节就能存放,于是就诞生了变长编码UTF-16,采用1个或者2个代码单元表示

  1. 对于从U+0000`U+D7FF`以及从`U+E000`U+FFFF的代码点:直接将代码点等值转化为16比特的二进制序列
  2. 对于从U+10000~U+10FFFF的代码点,先减去 0x10000 得到 0x00000 ~ 0xfffff 的20bit长的序列,然后分为高 10bit 和低 10bit ,于是,第一个编码单元 = 高10bit + 0xD800, 第二个编码单元 = 低10bit + 0xDC00(其实就是在高 10bit 和 低 10bit 之前添加一个前缀)

2.4 UTF-8

对于一些欧美地区以英语为母语的国家,使用的大多数字符在ASCII码中都能找到,于是UTF-16对于他们来说显得过于臃肿(空间利用率不高),于是就有了UTF-8,UTF-8的第一个字节与ASCII码兼容。

UTF-8编码单元为一个字节,有三种变长形态

  • 0xxxxxxx,如果是这样的01串,也就是以0开头后面是啥就不用管了XX代表任意bit.就表示把一个字节做为一个单元.就跟ASCII完全一样
  • 110xxxxx 10xxxxxx.如果是这样的格式,则把两个字节当一个单元
  • 1110xxxx 10xxxxxx 10xxxxxx 如果是这种格式则是三个字节当一个单元

对于欧美人民来说,会毫不犹豫的选择UTF-8,而我们却会犹豫一会,我们可能很多字符都需要占到3个字节(相较于UTF-16存储效率反而下降了),另一方面由于其变长字节表示,在计算字符数和执行索引时效率并不高,所有我们可能更常用UTF-16或UTF-32

猜你喜欢

转载自blog.csdn.net/weixin_44338712/article/details/108881339