Unicode编码详解(二):编码预备知识

Unicode编码详解(二):编码预备知识

若觉得本文写得还可以,请多多关注本人所作书籍《C++语法详解》电子工业出版社出版,网盘地址:
https://pan.baidu.com/s/1dIxLMN5b91zpJN2sZv1MNg

本文为原创文章,转载请注明出处,或注明转载自“黄邦勇帅(原名:黄勇)

1.2 Unicode编码预备知识

一、计算机基础知识

编码牵涉到计算机硬件方面的内容,因此,有必要对计算机底层的知识作一讲解

1、字(Word)和字长:
  • 字通常由若干字节组成,一个字的二进制位数就是字长。
  • 字用于表示一次性处理数据的长度,是计算机的一个重要指标。通常,计算机可以高效的处理数据的大小是一个字的长度,而不是一个字节,所以,计算机处理数据时,是以一个“字(word)”的长度为整体进行处理的,当数据长度不足一个字长时,则将多个数据“拼成”一个字再进行处理,在其他指标相同的情况下,字长越大的计算机处理数据的速度就越快
  • 现代大多数计算机的字长通常是32或64位,也就是4或8字节,通常称处理32位字长的CPU为32位CPU,现在计算机的CPU大多数都已达到了64位,当然,要想发挥64位字长的性能,还必须使用64位的软件(如64位的操作系统等)。
2、字节序(Byte Order)和比特序
  • 字节序即字节的顺序,是指由多字节组成的数据(如int,long等数据),在计算机中存储、读取时各个字节的排列顺序。也就是说,对于单字节的数据,不存在字节序的问题。
  • 虽然CPU一次处理一个字长的数据,但是CPU对内存寻址的最小单元以及存储和传输的最小单元仍是字节,所以,对于多字节数据来讲,字节序是个很重要的影响因素。
  • 一个字节中的比特位也是有顺序的,被称为比特序,比特序通常由硬件直接自动处理,所以无需担心比特序的问题。比特序分为LSB
    0位序(即,数据的最低位存放在字节的第0位)和MSB 0位序(即,数据的最高位存放在字节的第0位),比特序只需了解即可。
3、字节序共分为三种
  • 大端序BE (Big-Endian,也称高尾端序),是指高位字节存放在内存的低地址,低位字节存放在内存的高地址。
  • 小端序LE (Little-Endian,也称低尾端序),是指高位字节存放在内存的高地址,低位字节存放在内存的低地址。
  • 中间序ME(Middle-Endian,也称混合序),不常用,本文不作介绍。
4、字节序根据使用环境以及软硬件的不同,还按以下方式分类
  • CPU字节序、设备字节序、网络字节序(简称网络序)、主机字节序(简称主机序)等
  • 网络字节序(简称网络序)是TCP/IP规定的一种数据格式,网络字节序被定义为大端序,也就是说,在网络间传递数据时,都是使用的大端序。
  • 主机字节序(简称主机序)是指的计算机的字节序,这与操作系统和CPU有关。
  • 网络序与主机序经常需要进行转换
5、表3列出了常见软硬件及环境的字节序类型

Unicode编码详解(二):编码预备知识_第1张图片

二、Unicode编码基础知识以及编码的概念

1、

Unicode编码规定了将代码点转换(或编码)为一定长度的二进制序列的规则,以便于计算机处理

2、

Unicode规定了多种字符编码方式,如UTF-8、UTF-16、UTF-32等,其中UTF是Unicode Transformation Format (统一码转换格式)的缩写。最初Unicode只有UTF-16一种编码方式,UTF-8和UTF-32是后来才引入的编码方式。

3、理解“编码"
  • 由于以前字符编码与字符编号没有分开(如ASCII字符集),所以,编码、编号、编码方式等术语经常混用。
  • 本文的编码具有以下几种含义,读者应注意从上下文区分
  • 作为动词使用,含有转换的意思,通常特指转换为二进制值。比如把U+6C49编码(转换)为二进制值,对U+6C49进行编码等。
  • 指把码点值(通常为一个整数值)转换为二进制值的方式,通常说为“编码方式”,“编码方法”等,如UTF-8,UTF-16等就是两种不同的编码方式
  • 指编码之后的二进制值,比如字符U+6C49,若编码后的二进制为110 1100 0100 1001,则该二进制值在本文中也称为“编码”或“编码值”,即,U+6C49的编码为110 1100 0100 1001

三、编码思维

以“汉”字为例,其码点为U+6C49,对应的二进制为110 1100 0100 1001,共有15位,这意味着至少需要2个字节来表示该字符,可以很自然的想到以下的编码方式

方法1:直接编码

最简单的编码方式就是直接以原始二进制编码,一个字节长度的ASCII字符集就是使用的这种编码方式,但对于2个或更多字节的字符(比如汉字),就产生了一个问题,计算机如何知道这2个字节表示的是一个字符而不是两个字符呢(即,计算机不知道一个字符占据的长度)? 如果解决了一个字符占据多少二进制位的问题,就能使占据一个字节的字符使用一个字节来表示(比如英文字符),占据二个字节的字符使用二个字节来表示,当然,也可能是使用更多字节来表示,总之,这样就能使用变长字节的方式进行编码了,这在一定程度上能节省空间,UTF-8就属于这种编码方式

方法2:取所有字符中占据字节数最多的字节长度编码

假设Unicode字符占据字节数最多的为4字节,那么,就使所有的字符都使用4个字节来表示,不足的就在前面补0,很明显,这种编码方式造成了极大的空间浪费,因为,占据一个字节的英文也需要使用4字节来编码,这就导致文件大小扩大了3倍之多,不过,UTF-32就是使用的这种定长编码方式,字符统一用4字节编码。

UTF-16是介于UTF-8和UTF-32之间的一种编码方式,使用两个或四个字节来编码。

四、Unicode编码的重要概念

1、码元(Code Unit,或译为代码单元,编码单元)
  • 码元可理解为对码点值进行编码时的最小基本单元,类似于字的概念,所以,应把码元当作一个整体来看待。UTF-8是8位的单字节码元,UTF-16是16位的双字节码元,UTF-32是32位的四字节码元。多字节码元存在字节序问题,单字节码元不存在字节序问题。
  • 码元在某种程度上对应于高级语言中的数据类型,也就是说,码元在某种程度上可理解为“不同的码元表示不同的数据类型”。
  • 下表为Unicode编码方式的简略比较

Unicode编码详解(二):编码预备知识_第2张图片

2、码元序列与字节序列
  • 码元序列是指编码后以码元为单位所形成的序列,这串序列是一串二进制串,比如,使用UTF-8编码后形成的码元序列是以8位码元为长度的,UTF-32编码后形成的码元序列是以32位码元为长度的。
  • 在前文已经讲过,码元序列和字节序列都是一串二进制(即,二进制序列或二进制串),他们的区别在于,字节序列确字了字节序,而码元序列没有。

3、字节序标记(Byte-Order Mark,BOM,全称为字节序顺序标记)

字节序标记BOM用于标明多字节数据的字节序,即,在多字节数据中使用一个标记,来表明该数据是大端序还是小端序,这个标记就是BOM

本文作者:黄邦勇帅(原名:黄勇)

Unicode编码详解(二):编码预备知识_第3张图片

你可能感兴趣的:(Unicode,unicode,unicode编码,UTF-8,UTF-16)