Contents
  1. 1. 字符集和编码
    1. 1.1. 字符集和字符编码的区别
      1. 1.1.1. 盘古开天辟地—ASCII编码
      2. 1.1.2. 膨胀的盘古—扩展ASCII
      3. 1.1.3. 天朝母语—GB系列

字符集和编码

开发过程中,字符编码始终是程序员绕不开的一个话题。以下是针对Unicode和UTF-8的区别,简要整理一下有关字符编码的内容。
历史原因,在计算机的世界中,所有的信息都是0/1组合的二进制序列,计算机是无法直接识别和存储字符的。因此,字符必须经过编码才能被计算机处理。首先强调以下几个概念:

理解字符集和字符编码的区别

系统、终端、文件和程序不同概念上的编码

常见操作系统、文本编辑器对字符编码的处理

字符集和字符编码的区别

如上所述,字符只有按照一定规则编码,最终表示为0/1二进制序列的形式,才能被计算机处理。问题来了,怎么定义这种编码映射呢?所以,要求大家按照相同的规则,规定好字符与二进制序列(表示为某个数值)的映射关系。然而,林子大了,什么鸟都有。由于历史和地域的原因,也就形成了等多种不同场合、语言的字符集,如ASCII、GBK、Unicode等。

因此,某种意义上,可以理解为,字符集是一种协议,而字符编码是对字符集的一种实现。可以想到,最直接的编码方式,便是直接使用字符对应的二进制序列,这样就导致了字符集合字符编码看起来是一个东西,长此以往,可能就会对Unicode和UTF的区别有些困惑。

盘古开天辟地—ASCII编码

在计算机内部,所有信息最终都被表示为一个二进制序列。每一个二进制为有0和1两种状态,因此8个二进制为就可以组合出256(2^8)种状态,这被称为一个字节(byte)。即,一个字节一共可以表示256种不同的状态,每一个状态对应一个符号,共256个符号,0000 0000 - 1111 1111。

强调一点,ASCII便是字符集和字符编码相同的情况,直接将字符对应的8位二进制数作为最终形式存储。因此,当我们提及ASCII,既表示了一种字符集,也代表了一种字符编码,即常说的“ASCII编码”。

ASCII表如下图所示。

ASCII表

膨胀的盘古—扩展ASCII

英语有128个符号编码就够了,对于其他语言来说,128个符号是不够的。同时,1byte中,最高位还未投入使用,这能够再编码128个符号!于是乎,欧中国家决定利用闲置的最高位编入新的符号。这样一来,欧洲国家使用的编码体系,可以表示最多256个符号。从128到255这些字符被称为“扩展字符”。

基于此,ISO组织在ASCII基础上又制定了一系列标准用来扩展ASCII编码,它们是ISO-8859-1~ISO-8859-15,其中ISO-8859-1(又称为Latin-1)涵盖了大多数西欧语言字符,被广泛应用。ISO-8859-1仍然是单字节编码,能表示256个字符。

天朝母语—GB系列

西洋字符数量较少,一个byte(8bit)基本够用,然鹅我天朝文化博大精深0_0,光常用字就好几千呢!!但这难不倒我们勤劳勇敢的中国人,GB2312字符集诞生了!

GB2312的思想其实很简单—既然一个byte不够用,正所谓,“没有1一个byte解决不了的问题,如果有,就2个byte”。理论上,2个字节便可以表示2^16=65536的字符。不过,GB2312被设计时,只规定了中文常见字,很多特殊字符还没有包含。GB2312共收录了7455个字符,包括6573个汉字和682个其他符号。

尴尬的是,伟大的GB2312规定的字符太少,以致于有些国家领导人名字的汉字表示不出来!于是1995年,汉字扩展规范GBK1.0(《汉字内码扩展规范》),收录了21886个符号,它分为汉子去和符号区。GBK编码是GB2312编码的超集,向下完全兼容GB2312。

2000年的GB18030是取代GBK1.0的正式国家标准。GB18030编码向下兼容GBK和GB2312。

GBK和GB2312都是双字节等宽编码,如果算上为与ASCII兼容所支持的单字节,也可视为是单字节和双字节混合的变长编码。GB18030编码是变长编码,采用单字节、双字节和4字节方案,其中单字节、双字节和GBK是完全兼容的,4字节编码的码位就是收录了CJK扩展A的6582个汉字。

从ASCII、GB2312、GBK到GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一处理,区分中文编码的方法是最高字节的最高位不为0。

Contents
  1. 1. 字符集和编码
    1. 1.1. 字符集和字符编码的区别
      1. 1.1.1. 盘古开天辟地—ASCII编码
      2. 1.1.2. 膨胀的盘古—扩展ASCII
      3. 1.1.3. 天朝母语—GB系列