字符编码介绍
作为一个程序员如果对编码不了解的话,有点说不过去。本文主要介绍字符编码基本概念、几种字符编码方式(ASCII、GB系列、Unicode)、举例介绍编码规则(UTF-8和UTF-16)
一、字符编码
1.1. 背景
计算机内部存储和处理的基本单元是0和1两个状态,如何将我们日常使用的字符让计算机去处理和存储就是字符编码需要完成的事情。例如我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。通俗的说,按照何种规则将字符存储在计算机中,如'a'用什么表示,称为"编码";反之,将存储在计算机中的二进制数解析显示出来,称为"解码",如同密码学中的加密和解密。在解码过程中,如果使用了错误的解码规则,则导致'a'解析成'b'或者乱码。
字符集:是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等
编码:将字符集转换为计算机可识别单元的过程,建立一个一一对应关系,编码需要解决的问题是映射关系保持唯一并且可唯一解码。
解码:将编码后的单元转换为字符集的过程。
如果编码和解码所使用的规则不一致,就必然导致乱码。
1.2. ASCII
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语。
字符集:主要包括控制字符(回车键、退格、换行键等);可显示字符(英文大小写字符、阿拉伯数字和西文符号)等共128个字符
字符编码:使用7位(bits)表示一个字符,共128字符。一般计算机内部使用字节为一个处理单元8位,实际处理时高位设置为0,使用剩余7位作为实际存储。编码范围:0x00-0x7F(最高位也常用做奇偶校验,用1个字节表示)
1.3. 扩展ASCII
英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的。比如,在法语中,字母上方有注音符号,它就无法用ASCII码表示。于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。
但是,这里又出现了新的问题。不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号。但是不管怎样,所有这些编码方式中,0--127表示的符号是一样的,不一样的只是128--255的这一段。
字符集合:包括标准ASCII之外的其他欧洲字符。
字符编码:使用一个字节8位进行编码,同时保证前128个字符为ASCII字符,后128个字符每个国家而异。
由于互联网的高速发展,不同的编码方式会带来交互的不变,因此急需一个统一的编码方案。在此之前先看一下中文字符编码。
1.4. 几个概念
SBCS:Single Byte Character Set:单字节字符编码集合
DBCS:Double Byte Characer Set:双字节字符编码集合
MBCS:Multi Byte Character Set:多字节字符编码集合
代码页:字节和字符之间的映射表(微软公司)
1.5. GB2312
一个字节的编码对于中文来说是杯水车薪,中国人采用两个字节对汉字进行编码。
GB2312或GB2312-80是中国国家标准简体中文字符集,全称《信息交换用汉字编码字符集·基本集》,又称GB0,由中国国家标准总局发布,1981年5月1日实施。GB2312编码通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB2312。GB2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率。对于人名、古汉语等方面出现的罕用字,GB2312不能处理,这导致了后来GBK及GB 18030汉字字符集的出现。
字符集:包括6763个汉字和682个符号
字符编码:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。
注:在这些编码里,还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字符了。
1.6. GBK和GB18030
GBK是对GB2312-80的扩展,也就是CP936字码表 (Code Page 936)的扩展(之前CP936和GB 2312-80一模一样),最早实现于Windows 95简体中文版。虽然GBK收录GB 13000.1-93的全部字符,但编码方式并不相同。GBK自身并非国家标准,只是曾由国家技术监督局标准化司、电子工业部科技与质量监督司公布为"技术规范指导性文件"。原始GB13000一直未被业界采用,后续国家标准GB18030技术上兼容