字符编码简单术语解释
以下的内容全部来源于维基百科中文版中的摘抄
字符编码(character encoding),字符映射(character map),字符集(character set)或者代码页,在历史上是同义概念。也就是字符表(repertoire)中的字符如何编码为码元的流——通常是每个字符对应单个码元。
码元
英文名称(Code Unit, 也称“代码单元”),是指一个已编码的文本中具有最短的比特组合的单元。例如:UTF-8的码元是8比特长;UTF-16的码元是16比特长;UTF-32的码元是32比特长;
抽象字符表(Abstract character repertoire)
一个系统支持的所有抽象字符的集合。
编码字符集(CCS:Coded Character Set)
将字符集中每个字符映射到一个整数值的坐标(x, y)或者表示为一个非负整数(N)。字符集及码位映射称为编码字符集。
编码空间(encoding space)
包含所有字符的表的维度。可以用一对整数或者一个整数来描述。
码位(code point)
编码空间中的一个位置称为码位。
码位值(code point value)
一个字符所占用的码位称为码位值。
字符编码表(CEF:Character Encoding Form)
也称为"storage format",将编码字符集的非负整数值(抽象的码位)转换成有限比特长度的整型值(码元)的序列。
字符编码方案(CES:Character Encoding Scheme)
也称作“serialization format”。将定长的整型值(码元)映射到8位字节序列,以便编码后的数据的文件存储或者网络传输。
传输编码语法(transfer encoding syntax)
用于处理上一层次的字符编码方案提供的字节序列。一般其功能包括两种:一是吧字节序列的值映射到一套更受限制的值域内,以满足传输环境的限制;另一种是压缩字节序列的值。
参考:
Unicode编码
中文称万国码、国际码、统一码、单一码,是计算机科学领域的业界标准。
在文字处理方面,统一码为每一个字符而非字形定义唯一的代码(即一个整数,也就是码元)。统一码以一种抽象的方式(即数字)来处理字符,并将视觉上的演绎工作(例如字体大小、外观形状、字体形态、文体等)留给其他软件来处理,例如浏览器或文字处理器。
在表示一个Unicode的字符时,通常会用 “U+” 然后紧接着一组十六进制的数字来表示一个字符。在基本多文种平面(英语: Basic Multilingual Plane, 简写 BMP。又称为 “零号平面”、plane 0)里的所有字符,要用四个数字(2个字节,共16比特,共支持6万多个字符,例如 U+4AE0);在零号平面以外的字符则需要使用五或六个数字。在Unicode 3.0里使用“U-”然后紧接着八个数字,而“U+”则必须随后紧接着四个数字。
Unicode的编码和实现
大概来说,Unicode编码系统可分为编码方式和实现方式两个层次。
编码方式
目前实际应用的统一码版本对应于 UCS-2,使用16比特长(位)的编码空间。也就是每个字符占用2个字节。这样理论上一共最多可以表示2^16(即65536)个字符。基本满足各种语言的使用。实际上当前版本的统一码并未完全使用这16位编码,而是保留了大量空间以作为特殊使用或将来扩展。
上述的16位统一码字符构成基本多文种平面。最新(但未实际广泛使用)的统一码版本定义了16个辅助平面,两者合起来至少需要占据21位的编码空间。但事实上辅助平面字符仍然占用4个字节编码空间,与 UCS-4 保持一致。UCS-4是更大而尚未填充完全的31位字符集,加上恒为0的首位,共需占据32位,即4字节。
基本多文种平面的字符的编码位 U+hhhh,其中每个h代表一个十六进制数字,与 UCS-2 编码完全相同。而其对应的4字节 UCS-4 编码后两个字节一致,前两个字节则所有位均为0。
UCS-2 是代表16比特长(2个字节)的固定长度的编码;UCS-4是代表32比特长(4个字节)的固定长度的编码。
实现方式
Unicode的实现方式不同于编码方式。一个字符的Unicode编码确定。但是再实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。
Unicode的实现方式称为Unicode转换格式(Unicode Transformation Format, 简称为 UTF)
节省空间
如果一个仅包含基本7位 ASCII 字符的Unicode文件,如果每个字符都是用2个字节的原 Unicode 编码传输,其第一字节的8位始终为 0。这样就会造成比较大的浪费空间。所以对于这种情况,可以使用 UTF-8 编码,这是变长编码,它将基本7位的 ASCII 字符仍用7位编码(一个字节,首位补 0)表示,而如果遇到与其他 Unicode 字符混合的情况,将按一定算法转换,每个字符使用 1-3个字节编码,并利用首位为 0 或 1 识别。
字节顺序的理解不一致
如果直接使用与 Unicode 编码一致的 UTF-16 编码,由于每个字符占用了两个字节,在Mac机和个人电脑上,对字节顺序的理解不一致。这时同一字节流可能会解释为不同内容。如某字符的十六进制编码 4W59,按照 2 个字节拆分为 4E 和 59,在 Mac上读取时是从低字节开始,那么在 Mac OS 会认为此 4E59 编码为 594E,找到的字符为 “奎”, 而在 Windows 上从高字节开始读取,则编码为 U+4E59 的字符为 “乙”。那么 Windows 在 UTF-16 编码上保存的字符是 “乙”。所以在不同电脑上就可能发生混淆
为了解决这种问题,于是在 UTF-16 编码实现方式中使用了 大端序(Big-Endian, 简写为 UTF-16 BE)、小端序(Little-Endian, 简写为 UTF-16 LE)的概念,以及可附加的字节顺序记号解决方案。
除了上面的编码外,Unicode的实现方式还包括UTF-7、CESU-8、UTF-32、GB18030等。目前通用的实现方式是UTF-16小端序(LE)、UTF-16大端序(BE)和UTF-8。
参考:
UTF-8
UTF-8(8-bit Unicode Transformation Format)是一种针对 Unicode 的可变长度字符编码,也是一种前缀码。它可以用一至四个字节对Unicode字符集中的所有有效编码点进行编码,属于 Unicode 标准的一部分。
UTF-8使用一至六个字节为每个字符编码(尽管如此,2003年11月UTF-8被RFC 3629重新规范,只能使用原来Unicode定义的区域,U+0000到U+10FFFF,也就是说最多四个字节)
128个US-ASCII字符只需一个字节编码(Unicode范围由U+0000至U+007F)。
带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则需要两个字节编码(Unicode范围由U+0080至U+07FF)。
其他基本多文种平面(BMP)中的字符(这包含了大部分常用字,如大部分的汉字)使用三个字节编码(Unicode范围由U+0800至U+FFFF)。
其他极少使用的Unicode 辅助平面的字符使用四至六字节编码(Unicode范围由U+10000至U+1FFFFF使用四字节,Unicode范围由U+200000至U+3FFFFFF使用五字节,Unicode范围由U+4000000至U+7FFFFFFF使用六字节)。
详细的编码实现请阅读下面的链接 🔽
参考:
😃😄