字符编码(ASCII、GBK、UTF-8、ANSI)详解

一、ASCII

ASCII (American Standard Code for Information Interchange) - 美国信息交换标准代码

由于计算机最初只支持英文,最先出现的字符编码:ASCII 码。

ASCII 码采用 1 个字节编码,共定义了128个字符。
字符编码(ASCII、GBK、UTF-8、ANSI)详解

二、GB2312、GBK、GB18030、Big5

随着计算机的不断发展,支持简体中文的字符集包括:GB2312 、GBK 、GB18030、Big5(繁体)。

中文一般使用 2 个字节编码,字符编码集容量大小: GB2312 < GBK < GB18030。

1、GB2312

规定中文占 2 个字节,小于 127 的编码按 ASCII 标准解释字符,当 2 个大于 127 的字符连在一起时,表示 1 个汉字。
字符编码(ASCII、GBK、UTF-8、ANSI)详解
2、GBK

规定对收录的每个字符采用 2 个字节表示,对于 ASCII 中的字符占 1 个字节。

3、GB18030

在 GBK 的标准上不断扩展字符,GB18030 的编码使用 4 个字节,兼容 GBK、GB2312 及 ASCII 标准。

即便使用 GB18030 编码,在显示常用汉字时仍然是 2 个字节(用 GBK 或 GB2312 方式解码),英文字母是1个字节。

4、Big5

在*、香港等地区,使用较多的是 Big5 编码,它的主要特点是收录了繁体字。而从GBK 编码开始,已经把 Big5 中的所有汉字收录进编码了。

三、Unicode

可容纳世界所有文字符号的国际标准编码,Unicode 编码规定中文占 2 个字节,英文占 2 个字节。由 Unicode 编码方案衍变出 UTF-8、UTF-16、UTF32。

1、UTF-32

规定对 Unicode 字符集里的每个字符都用 4 字节来表示,因此 UTF-32 不兼容 ASCII 编码,也就是说 ASCII 编码的文件用 UTF-32 标准来打开会成为乱码。

优点:编码简单,解码也很方便,读取编码的时候每次都直接读 4 个字节,不需要加其它的判断。

缺点:浪费存储空间,不兼容ASCII码(一个英文字母要4个字节表示),在存储的时候需要指定字节顺序。

2、UTF-16

UTF-16 使用 2 或 4 个字节为每个字符编码,其中大部分汉字采用 2 个字节编码,少量不常用汉字采用 4 个字节编码。

缺点:仍不兼容 ASCII 码(一个英文字母要用2个字节来表示),仍有大小端格式问题。

3、UTF-8

如今有些中文网站也常用 GBK 编码,而不用 UTF-8 编码,因为 UTF-8 编码的中文字符占 3 个字节,造成资源浪费。

变长编码方式,编码有 1、2、3、4 字节长度的方式,每个 Unicode 字符根据自己的编号范围去进行对应的编码。

如果第一个字节的 bit 位以 0 开头,那就是 ASCII 字符(解决了ASCII码的兼容问题),以单字节进行解析;如果第一个字节的数据位以“110”开头,就按双字节进行解析,3、4 字节的解析方法类似。

优点:兼容了 ASCII 码,节约空间,且没有字节顺序的问题。

四、ANSI

ANSI码 (American National Standards Institute) - 美国国家标准学会标准码

ANSI 并不是某一种特定的字符编码,而是在不同的系统中,ANSI 表示不同的编码。如:在简体中文 Windows 操作系统中,ANSI 编码代表 GB2312 或 GBK 编码;在繁体中文 Windows 操作系统中,ANSI 编码代表 Big5。
字符编码(ASCII、GBK、UTF-8、ANSI)详解
【注意】:Java 源代码采用 Unicode 编码方式(不管是中文、英文都是用 2 个字节来表示),编译后的 .class(字节码文件),由于大部分是英文字符,Java 规定采用 UTF-8 保存,英文用 1 个字节表示,可以大量节省存储空间。