【计算机】字符编码的发展与关系

【计算机】字符编码的发展与关系

编码方案与字符集

字符编码说到底就是一种将字符存储在计算机中的方式,如通常会将字符与一个二进制串对应,从而映射到字节流中。而表示字符与二进制串对应关系的表叫做字符集,而具体将对应的二进制串映射到字节流中的方法则叫编码方案。

所以说编码方案和字符集不是同一种东西,两者配合才构成一个完整的字符编码。通常一个系列的编码考虑兼容性都会使用同一个字符集,但一个字符集可能有多个编码方案,这些编码方案之间可能兼容也可能不兼容。

所以,虽然看起来下文较多的讲述编码方案,但要知道每种编码都有隐含的字符集在内,一般编码名即使是字符集的名称。

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。所以虽然有这种编码方式,但因为兼容性的原因并不推荐。

参考资料


【计算机】字符编码的发展与关系
https://bdffzi-blog.pages.dev/posts/1673174570.html
作者
BDFFZI
发布于
2024年1月31日
许可协议