ASCII、GB2312、GBK、Unicode、UTF-8、ANSI 编码详解整理
[編輯] [转简体] (简体译文)概要
正文
ASCII 美国信息交换标准代码(最早的编码规则)
使用 7 位二进制数(最高位二进制为 0)来表示所有的大写和小写字母、数字 0 到 9、标点符号以及在美式英语中使用的特殊控制字符,总共为128个。例如:
二进制 | 字符 | 说明 |
---|---|---|
0000 0000 | NUL | 空字符 |
0010 0000 | (space) | 空格键 |
0011 0000 | 0 | 字符0 |
0110 0001 | a | 字符a |
0111 1111 | DEL (delete) | 删除 |
GB2312 汉字内码扩展规范
GB2312 编码,就是在 ASCII 编码的基础上进行扩充的,它规定如下:
ASCII 的字符完整地包含在 GB2312 里,编码不变,仍然是以 0 开头,用一个字节来表示一个字符;对于 ASCII 没有的字符,就用 1 开头来区分,用两个字节合起来表示一个字符。
这样,在解码的时候,遇到字节是以 0 开头的,就知道这一个字节就表示了一个字符;遇到字节是以 1 开头的,就知道要加上下一个字节合起来表示一个字符。这样就在 GB2312 中既把 ASCII 的字符包含了进来,又能将它们区分出来,能达到兼容的效果了。
GB2312 能够表示很多简体汉字,但是繁体怎么办呢?台湾群众很不满啊,于是也自己搞了一套编码,于是 BIG-5 诞生了。此外,GB2312 仅仅可以表示 6000 多个常用汉字,那么其它不常用的怎么办?于是进行了扩展,把之前 GB2312 中没有利用的位好好利用起来,就成了 GBK,其中 K 为“扩展”的“扩”(kuo4)。GBK 共收入 21886 个汉字和图形符号,包括:
GB 2312 中的全部汉字、非汉字符号。
BIG-5 中的全部汉字。
与 ISO 10646 相应的国家标准 GB 13000 中的其它 CJK 汉字,以上合计 20902 个汉字。
其它汉字、部首、符号,共计 984 个。
GBK 向下与 GB 2312 完全兼容,向上支持 ISO 10646 国际标准,在前者向后者过渡过程中起到的承上启下的作用。
Unicode 兼容所有国家文字的字符集(万国码、统一码)
由于世界国家众多,语言差别也很大。ISO(国际标准化组织)决定定义一套编码方案来解决所有国家的编码问题。ISO对 Unicode 编码规定如下:
每个字符必须使用两个字节,即用 16 位二进制来表示所有的字符,对于 ASCII 编码表里的字符,保持其编码不变,只是将长度扩展到了 16 位,其他国家的字符全部统一重新编码。
由于传输 ASCII 表里的字符时,实际上可以只用一个字节就可以表示,所以,这种编码方案在传输数据比较浪费带宽,存储数据比较浪费硬盘,为了解决这个问题,就在 Unicode 的基础上,定义了一套编码规则,这个新的编码规则就是UTF-8(Universal Character Set/Unicode Transformation Format - 8),采用 1-4 个字节进行传输和存储数据。
具体规则:
1)对于单字节的符号,字节的第一位设为 0 ,后面7位为这个符号的 Unicode 码。因此对于 英语字母,UTF-8 编码和 ASCII 码是相同的。
2)对于 n 字节的符号(n > 1),第一个字节的前 n 位都设为 1 ,第 n + 1 位设为 0 ,后面字节的前两位一律设为 10 。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。
UTF-8区分每个字符的开始是根据字符的高位字节来区分的,方式如下表:
二进制 | 表达字符所需字节数 |
---|---|
0xxxxxxx | 一个字节 |
110xxxxx 10xxxxxx | 二个字节 |
1110xxxx 10xxxxxx 10xxxxxx | 三个字节 |
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | 四个字节 |
ANSI 多字节字符集
为了使计算机支持多种语言,不同的国家和地区制定了不同的标准。
ANSI表示英文字符时用一个字节,表示中文用两个字节。由此产生了 GB2312,BIG-5,JIS 等各自的编码标准。简体中文系统下,ANSI 编码可以是 GB2312 或者 GBK 编码,在日文操作系统下 ANSI 编码代表 JIS 编码,而韩文系统中 ANSI 编码其实是 EUC-KR 编码。
因此 ANSI 并不是某一种特定的字符编码,而是在不同的系统中,ANSI 表示不同的编码。Windows 系统通过 Windows code pages 的值来确定当前系统的编码方式。
参考资料