【计算机】字符编码的发展与关系
编码方案与字符集
字符编码说到底就是一种将字符存储在计算机中的方式,如通常会将字符与一个二进制串对应,从而映射到字节流中。而表示字符与二进制串对应关系的表叫做字符集,而具体将对应的二进制串映射到字节流中的方法则叫编码方案。
所以说编码方案和字符集不是同一种东西,两者配合才构成一个完整的字符编码。通常一个系列的编码考虑兼容性都会使用同一个字符集,但一个字符集可能有多个编码方案,这些编码方案之间可能兼容也可能不兼容。
所以,虽然看起来下文较多的讲述编码方案,但要知道每种编码都有隐含的字符集在内,一般编码名即使是字符集的名称。
ASCII(美国信息交换标准代码)
ASCII发布于1967年,是相当早期的编码标准,并一直沿用至今,奠定了后续编码标准的基础。
其采用一个字节对应一个字符的形式,但也因此只能存储字母数字等西文字符,不能满足全球化的需求。
ANSI码(美国国家标准学会码)
由于ASCII不能满足全球化的需求,所以之后各国都开始以ASCII为基础定制自己本国的编码格式,如GB2312(一种中文编码),Shift_JIS(一种日文编码)等。
这些编码都有同一特性:和ASCII兼容,但互相之间不兼容。所以使用这些编码同时只能显示一种地区支持的语言。
这类的编码格式种类繁杂,因此一个叫ASNI的组织站了出来,定制了一个叫“代码页”的标准,其统计了这类编码格式,给每个格式都分配了专属的代码页编号,也因此这类编码又被称做ANSI编码。
所以说ANSI码并不是指一个特定的文本编码,而是指代一群有相同特征的编码。
GB系列编码
GB是“国标”的拼音首字母,是中国地区的ANSI码,其一共有三代:“GB2312”、“GBK”、“GB18030”,三者都是按顺序发展出来。
GB2312
GB2312是最早的中文编码标准,每个字占两个字节,与ASCII兼容,一共收录了6763个汉字以及682个特殊符号,已经包含了所有生活中的常用汉字了。
GBK
GB2312只有6000多个汉字,肯定是无法满足所有汉字的数量需求的,因此GBK得以出现,在与GB2312兼容的基础上,将汉字数量扩充到了20902个,符号数达到了984个,并且包含了对繁体字的支持。
GB18030
即使GBK的字符数高达两万多,但依旧是不够中国地区使用的,在与GBK兼容的基础上,这次直接将每字符两字节改为了四字节,还增加了很多少数民族所用的文字。
Unicode(万国码)
ANSI码只是让各国有了自己的字符编码,但依旧没有满足全球化的需求,现在急需一款能在全球通用的字符编码,于是Unicode编码得以出现。
最开始的时候有多个组织都在试图制定全球通用的编码标准,比如一个是ISO定制的UCS,还有一个是统一码联盟指定的“Unicode”。当然,1991年前后,人们很开就意识到世界不需要两个通用编码标准,所以两者开始合并成果并协同后续工作,于是现代的Unicode得以诞生。
UCS-4与UTF-32
这两个编码方案都是4字节的定长存储,但这太浪费空间了所以很少使用。其他地方两者基本一样,UTF-32的提出主要是为了ISO和统一码联盟两者字符集互相兼容而产生的。
UCS-2与UTF-16
UCS-2是很早期的Unicode编码方案,采用2字节的定长方式存储字符,很显然现在它已经被淘汰了,因为2字节根本无法满足存储全球文字的需求。
所以UTF-16诞生了,它是UCS-2的升级版,所以与之兼容,同时将定长存储改为了变长存储,需要时会将字符空间扩展到4字节。
因为最低两字节,所以UTF-16有字节序的问题,因此会在文本开头带上额外的DOM(字节序标记),用于标识大端模式(BE)还是小端模式(LE),在Windows环境下通常会将UTF-16 LE直接叫做“Unicode”。
UTF-8
UTF-8是较新的编码方案同时也是最流行的编码方案,它采用变长存储,与ASCII兼容,最低时一个字符只需1字节,直接化身ASCII码,所以在多语言文本环境(如HTML文件)中能很大的节省空间,同时扩展性也很强。
UTF-8 BOM
因为UTF-8是最低单字节的变长编码,所以实际上它是不需要BOM的,而且这不符合Unix使用习惯,因为Unix在设计上不建议这种看不见的文本内容;加BOM是微软的习惯,用于区分ASCII和UTF-8。所以虽然有这种编码方式,但因为兼容性的原因并不推荐。
参考资料
- 刨根究底字符编码之七——ANSI编码与代码页
- 一图弄懂ASCII、GB2312、GBK、GB18030编码
- 细说:Unicode, UTF-8, UTF-16, UTF-32, UCS-2, UCS-4
- Java 为什么使用 UTF-16 而不是更节省内存的 UTF-8?
- 「带 BOM 的 UTF-8」和「无 BOM 的 UTF-8」有什么区别?网页代码一般使用哪个?