浅谈什么是字符编码
计算机是如何存储数据的
在谈什么是字符编码前,我们首先要知道一个概念,计算机是如何存储数据的:
计算机是由逻辑电路组成,仅能识别二进制的电脉冲信号,二进制位的状态用0和1表示。计算机中最小的存储单位为一个比特,存放一个二进制数,八个比特组成一个字节。那么我们如何将日常中使用的文字与符号转换为计算机能够识别的二进制数呢,这就用到了字符编码。
字符编码的定义
字符编码,首先看维基百科中的定义:
字符编码(英语:Character encoding)、字集码:是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。
简单来说,在计算机科学中,字符编码就是一种编码规则,可以将字符集(某种包含了各种字符与文字的集合)中的字符转换为计算机能够识别的二进制代码。
常见的字符编码介绍
目前被我们大众所熟知的字符编码有以下几种:
-
ASCII码
ASCII,全称:American Standard Code for Information Interchange(美国信息交换标准代码),是基于拉丁字母的一套编码系统,由电报代码发展而来,主要用于显示现代英语。ASCII码标准由美国国家标准学会制定,最近一次更新于1986年。目前,ASCII码共规定了128个字符的编码,占用了一个字节的后七位,第一位统一规定为0。其中包含了英文的大小写字母、数字、标点符号等常用的字符。
e.g. 大写字母A在ASCII码中对应65,二进制码为:01000001。 -
**ISO 8859 **
ASCII码的诞生,帮助美国人解决了字符在计算机中的存储问题,但其他一些不使用英文的国家,就无法使用ASCII码。为此,各国专家纷纷借鉴ASCII的设计理念,编制了许多用 8 位二进制数来表示字符的扩充字符集。为了统一各国各语言的单独编码的混乱局面,国际标准化组织(ISO)及国际电工委员会(IEC)联合制定了一系列8位元字符集的标准,ISO 8859(全称ISO/IEC 8859)。ISO 8859的前七位完全兼容 ASCII,编号128 – 159 共32个编码保留给扩充定义的 32 个扩充控制码,160 为不换行空格,161 - 255的95个数字用于新增加的字符代码。目前,ISO 8859共定义了15个字符集。 -
**GB 2312/GBK/GB 18030 **
ISO8859解决了大多数的西方国家的编码问题,接下来还需要解决中国的编码问题。1980年,中国国家标准总局发布了GB 2312(或 GB 2312–80,全称:中华人民共和国国家标准简体中文字符集),并于1981年5月1日正式实施。GB 2312中,每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”,第二个字节称为“低位字节”。GB 2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个字符。
GB 2312的出现基本满足了汉字的计算机处理需求,但是对于一些生僻字、在GB 2312标准发布后才推出的简化字、台湾及香港使用的繁体字,日语及朝鲜语汉字等,GB 2312未收录其中。于是微软利用了GB 2312-80未使用的编码空间,收录了GB 13000.1-93的全部字符,制定了GBK编码,GBK编码向下兼容GB 2312。
2000年3月17日,中华人民共和国国家质量技术监督局又推出了GB 18030-2000标准,以取代GBK,但是将GBK作为子集完全保留。现行GB 18030版本由国家质量监督检验总局和中国国家标准化管理委员会于2005年11月8日发布,2006年5月1日正式实施,全称:国家标准GB 18030-2005《信息技术 中文编码字符集》,共收录汉字70,244个。 -
**Unicode **
上述的各种编码系统,在各个国家内部都得到了广泛的运用,但是在不同的国家之间使用时就容易出现不兼容的情况。这就需要一个统一的编码系统来解决这个兼容问题,于是就出现了Unicode(统一码)。
Unicode编码系统可分为编码方式和实现方式两个层次。Unicode码的编码方式与ISO制定的ISO 10646标准所定义的通用字符集(UCS)概念相对应,UCS包含了已知语言的所有字符。Unicode的实现方式不同于编码方式。一个字符的Unicode编码是确定的。但出于对于不同系统平台设计的适用需求及节省空间的需求,Unicode编码存在多种实现方式,这些实现方式称为Unicode转换格式(Unicode Transformation Format,简称为UTF)。
目前,UTF-8是在互联网上使用最为广泛的一种Unicode实现方式,其他还有UTF-16、UTF-32。UTF-8最大的特点是,它是一种变长的编码方式,可以用1~4个字节表示一个符号。
UTF的编码规则,大致可概括如下:
Unicode范围(十六进制) | UTF编码 (二进制) |
---|---|
0000 0000 - 0000 007F | 0xxxxxxx |
0000 0080 - 0000 07FF | 110xxxxx 10xxxxxx |
0000 0800 - 0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
0001 0000 - 0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
- 对于单字节的符号,UTF编码的第一位为0,后七位与Unicode编码一致,与ASCII码兼容。
- 对于多字节的符号,假设有n个字节,则第一个字节的前n位均为1,第n+1位为0,后n-1个字节的前两位均为10,其余的xxx均为Unicode码。