Unicode编码和区域编码有什么区别? unicode编码 unicode在线转码( 二 )



Unicode编码和区域编码有什么区别? unicode编码 unicode在线转码

文章插图
图 1. Unicode 17 个平面分布

Unicode编码和区域编码有什么区别? unicode编码 unicode在线转码

文章插图
图 2. Unicode 平面分布和码点空间
下面是一些相关术语的解释:
Coded Character Set(CCS): 即编码字符集,给字符表里的抽象字符编上一个数字,也就是字符集合到一个整数集合的映射 。这种映射称为编码字符集,Unicode 字符集就是属于这一层的概念;Character Encoding Form (CEF) :即字符编码表,根据一定的算法,将编码字符集(CCS) 中字符对应的码点转换成一定长度的二进制序列,以便于计算机处理,这个对应关系被称为字符编码表,UTF-8、 UTF-16 属于这层概念;Code Point: 码点,简单理解就是字符的数字表示 。一个字符集一般可以用一张或多张由多个行和多个列所构成的二维表来表示 。二维表中行与列交叉的点称之为码点,每个码点分配一个唯一的编号,称之为码点值或码点编号,除开某些特殊区域(比如代理区、专用区)的非字符码点和保留码点,每个码点唯一对应于一个字符 。Code Unit :代码单元,是指一个已编码的文本中具有最短的比特组合的单元 。对于 UTF-8 来说,代码单元是 8 比特长;对于 UTF-16 来说,代码单元是 16 比特长 。换一种说法就是 UTF-8 的是以一个字节为最小单位的,UTF-16 是以两个字节为最小单位的 。Code Space :码点空间,字符集中所有码点的集合 。BOM ( Byte Order Mark ): 字节序,出现在文件头部,表示字节的顺序,第一个字节在前,就是”大头方式”(Big-Endian),第二个字节在前就是”小头方式”(Little-Endian) 。这两个古怪的名称来自英国作家斯威夫特的《格列佛游记》,在该书中,小人国里爆发了内战,战争起因是人们争论,吃鸡蛋时究竟是从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开 。为了这件事情,前后爆发了六次战争,一个皇帝送了命,另一个皇帝丢了王位 。Unicode 几种常见编码方式Unicode 字符集中的字符可以有多种不同的编码方式,如 UTF-8、UTF-16、UTF-32、压缩转换等 。这里的 UTF 是 Unicode transformation format 的缩写,即统一码转换格式,将 Unicode 编码空间中每个码点和字节序列进行一一映射的算法 。下面详细介绍一下这三种常见的 Unicode 编码方式 。
UTF-8 编码方式
UTF-8 是一种变长的编码方式,一般用 1~4 个字节序列来表示 Unicode 字符,也是目前应用最广泛的一种 Unicode 编码方式,但是它不是最早的 Unicode 编码方式,最早的 Unicode 编码方式是 UTF-16 。UTF-8 编码算法有以下特点:
首字节码用来区分采用的编码字节数 :如果首字节以 0 开头,表示单字节编码;如果首字节以 110 开头,表示双字节编码;如果首字节以 1110 开头,表示三字节编码,以此类推;除了首字节码外,用 10 开头表示多字节编码的后续字节,图 3 列出 UTF-8 用 1~6 个字节所表示的编码方式和码点范围(实际上 1~4 个字节基本可以覆盖大部分 Unicode 码点);与 ASCI I 编码方式完全兼容 :U+0000 到 U+007F 范围内(十进制为 0~127)的 Unicode 码点值所对应的字符就是 ASCII 字符集中的字符,用一个字节表示,编码方式和 ASCII 编码一致;无字节序,在 UTF-8 编码格式的文本中,如果添加了 BOM,则表示该文本是由 UTF-8 编码方式编码的,而不用来说明字节序 。

Unicode编码和区域编码有什么区别? unicode编码 unicode在线转码

文章插图
图 3. UTF-8 编码方式
在实际的解码过程中:
情况 1: 读取到一个字节的首位为 0,表示这是一个单字节编码的 ASCII 字符;情况 2: 读取到一个字节的首位为 1,表示这是一个多字节编码的字符,如继续读到 1,则确定这是首字节,在继续读取直到遇到 0 为止,一共读取了几个 1,就表示该字符为几个字节的编码;情况 3: 当读取到一个字节的首位为 1,紧接着读取到一个 0,则该字节是多字节编码的后续字节 。图 4 概述了 UTF-8 编码方式的特点,其中的”自同步“表示在传输过程中如果有字节序列丢失,并不会造成任何乱码现象,或者存在错误的字节序列也不会影响其他字节的正常读取 。例如读取了一个 10xxxxxx 开头的字节,但是找不到首字节,就可以将这个后续字节丢弃,因为它没有意义,但是其他的编码方式,这种情况下就很可能读到一个完全不同或者错误的字符 。

Unicode编码和区域编码有什么区别? unicode编码 unicode在线转码

文章插图
图 4. UTF-8 编码方式
UTF-16 编码方式