我们先介绍一下字符集和编码的历史
字符集
字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。计算机要准确的处理各种字符集文字,就需要进行字符编码,以便计算机能够识别和存储各种文字。中文文字数目大,而且还分为简体中文和繁体中文两种不同书写规则的文字,而计算机最初是按英语单字节字符设计的,因此,对中文字符进行编码,是中文信息交流的技术基础。
编码
历史
很久很久以前,有一群人,他们研究出了可以开合的晶体管,这个晶体管可以表示出高电位和低点位这两种点位,也就是0和1,他们把这个称作位(bit)。
之后他们又决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物。他们看到8个开关状态是好的,于是他们把这称为“字节”(byte)。
再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去。他们看到这样是好的,于是它们就这机器称为"计算机"。(均摘自知乎)
分类
- 英文编码
- ASCII
- 汉字编码
- 一、汉字的编码流程
- 二、GB2312
- 三、GBK——专门为解决汉字的编码而生成的解决方案
- 四、GB18030
- 五、GB13000
- 六、Big5
- 通用编码
- ISO-8859系列
- Unicode
- UTF-16
- UTF-32
英文编码
一、ASCII
ASCII (American Standard Code for Information Interchange),这是美国在19世纪60年代的时候为了建立英文字符和二进制的关系时制定的编码规范,它最初是美国国家标准,供不同计算机在相互通信时用作共同遵守的西文字符编码标准,后来它被国际标准化组织(International Organization for Standardization, ISO)定为国际标准,称为ISO 646标准
它能表示128个字符,许多基于x86的系统都支持使用扩展ASCII。扩展ASCII 码允许将每个字符的第8 位用于确定附加的128 个特殊符号字符、外来语字母和图形符号;其中包括英文字符、阿拉伯数字、西文字符以及32个控制字符。它用一个字节来表示具体的字符,但它只用后7位来表示字符(2^7=128),最前面的一位统一规定为0
扩展的ASCII码
原本的ASCII码对于英文语言的国家是够用了,但是欧洲国家的一些语言会有拼音,这时7个字节就不够用了。因此一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号
比如
法语中的é的编码为130(二进制10000010)
这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。
但这时问题也出现了:不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。
比如
130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג)
在俄语编码中又会代表另一个符号。但是不管怎样,所有这些编码方式中,0—127表示的符号是一样的,不一样的只是128—255的这一段。这个问题就直接促使了Unicode编码的产生
表达方式
ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号,以及在美式英语中使用的特殊控制字符
其中:0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符)
- 如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等
- 通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等
注意:
在标准ASCII中,其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1
大小规则
常见ASCII码的大小规则:数字<大写字母<小写字母
1.数字比字母要小如“。如7”<“F”
2.数字0比数字9要小,并按0到9顺序递增。如 “3”<“8”
3.字母A比字母Z要小,并按A到Z顺序递增。如“A”<“Z”
4.同个字母的大写字母比小写字母要小32。如“A”<“a”
中文编码
一、汉字的编码流程
汉字编码分为外码、交换码、机内码和字形码
1.外码(输入码)
外码也叫输入码,又称汉字外码,无论是区位码或国标码都不利于输入汉字,为方便汉字的输入而制定的汉字编码,称为汉字输入码
汉字输入码属于外码。不同的输入方法,形成了不同的汉字外码。常见的输入法有以下几类:
- 按汉字的排列顺序形成的编码(流水码):如区位码
- 按汉字的读音形成的编码(音码):如全拼、简拼、双拼等
- 按汉字的字形形成的编码(形码):如五笔字型、郑码等
- 按汉字的音、形结合形成的编码(音形码):如自然码、智能ABC
一种好的编码应有编码规则简单、易学好记、操作方便、重码率低、输入速度快等优点,每个人可根据自己的需要进行选择
2.交换码(国标码)
计算机内部处理的信息,都是用二进制代码表示的,汉字也不例外。而二进制代码使用起来是不方便的,于是需要采用信息交换码。中国标准总局1981年制定了中华人民共和国国家标准GB2312--80《信息交换用汉字编码字符集--基本集》,即国标码
区位码
国标码的另一种表现形式,把国标GB2312--80中的汉字、图形符号组成一个94×94的方阵,分为94个“区”,每区包含94个“位”,其中“区”的序号由01至94,“位”的序号也是从01至94。94个区中位置总数=94×94=8836个,其中7445个汉字和图形字符中的每一个占一个位置后,还剩下1391个空位,这1391个位置空下来保留备用
3.机内码
根据国标码的规定,每一个汉字都有了确定的二进制代码,在微机内部汉字代码都用机内码,在磁盘上记录汉字代码也使用机内码
区位码,国标码,机内码的转换
(1)区位码先转换成十六进制数表示
(2)(区位码的十六进制表示)+2020H=国标码
(3)国标码+8080H=机内码
4.字形码
字形码是汉字的输出码,输出汉字时都采用图形方式,无论汉字的笔画多少,每个汉字都可以写在同样大小的方块中。通常用16×16点阵来显示汉字
二、GBK2312
1980 年,中国发布了<strong>第一个</strong>汉字编码标准,也即 GB2312 ,全称 《信息交换用汉字编码字符集·基本集》,通常简称 GB(“国标”汉语拼音首字母), 共收录了 6763 个常用的汉字和字符,此标准于次年5月实施,它满足了日常 99% 汉字的使用需求
三、GBK
GBK全称《汉字内码扩展规范》(GBK即“国标”、“扩展”汉语拼音的第一个字母,英文名称:Chinese Internal Code Specification),由于一些人名、繁体字、日语和朝鲜语中的汉字也没有包括在内,所以,在 GB2312 的基础上添加了这部分字符,就形成了GBK;共收录了两万多个汉字和字符,它完全兼容 GB2312,并且向上支持国际标准,是前者向后者过渡过程中的一个承上启下的产物
四、GBK18030
GB18030 全称《信息技术中文编码字符集》,共收录七万多个汉字和字符,它在 GBK 的基础上增加了中日韩语中的汉字和少数名族的文字及字符,完全兼容 GB2312,基本兼容 GBK
GB18030 发布过两个版本,第一版于2000年发布,称为 GB18030-2000,第二版于2005年发布,称为 GB18030-2005
五、GB13000
GB13000 全称:国家标准GB13000,Unicode 标准在基本平面上与GB 13000保持一致。GB13000.1-1993的字符集包含20902个汉字
- 此标准由中华人民共和国信息产业部提出
- 此标准由信息产业部电子工业标准化研究所归口
- 此标准起草单位:信息产业部电子工业标准化研究所
六、Big5
Big5,又称为<strong>大五码</strong>或<strong>五大码</strong>,是使用繁体中文(正体中文)社区中最常用的电脑汉字字符集标准,共收录13,060个汉字
Big5虽普及于台湾、香港与澳门等繁体中文通行区,但长期以来并非当地的国家/地区标准或官方标准,而只是业界标准。倚天中文系统、Windows繁体中文版等主要系统的字符集都是以Big5为基准,但厂商又各自增加不同的造字与造字区,派生成多种不同版本
中文字符编码与ASCII编码的关系
通用编码
ISO-8859系列
ISO8859 不是一个标准,而是一系列的标准,这套字符集与编码系统的共同特色是,以同样的码位对应不同字符集
- ISO8859-1 字符集
- 也称为Latin-1,是西欧常用字符,包括德法两国的字母
- ISO8859-2 字符集
- 也称为Latin-2,收集了东欧字符
- ISO8859-3 字符集
- 也称为Latin-3,收集了南欧字符
- ISO8859-4 字符集
- 也称为Latin-4,收集了北欧字符
- ISO8859-5 字符集
- 也称为Cyrillic,收集了斯拉夫语系字符
- ISO8859-6 字符集
- 也称为Arabic,收集了阿拉伯语系字符
- ISO8859-7 字符集
- 也称为Greek,收集了希腊字符
- ISO8859-8 字符集
- 也称为Hebrew,收集了西伯莱 (犹太人) 字符
- ISO8859-9 字符集
- 也称为Latin-5 或 Turkish,收集了土耳其字符
- ISO8859-10 字符集
- 也称为Latin-6 或 Nordic,收集了北欧 (主要指斯堪地那维亚半岛) 的字符
- ISO8859-11 字符集
- 也称为Thai,它是从泰国的 TIS620 标准字符集演化而来
- ISO8859-12 字符集,目前尚未定义
- ISO8859-13 字符集
- 也称为 Latin-7,主要函盖波罗的海(Baltic)诸国的文字符号,也补充一些在 Latin-6 中遗漏的拉脱维亚 (Latvian) 字符
- ISO8859-14 字符集
- 也称为Latin-8,它将 Latin-1 中的某些符号换成塞尔特语 (Celtic) 的字符,塞尔特族是指英伦外围的威尔斯人 (Welsh) 和盖尔人 (Gaelic)
- ISO8859-15 字符集
- 也称为Latin-9,或者被匿称为 Latin-0,它将 Latin-1 中较少用到的符号删除,换成当初遗漏的法文和芬兰字母;还有,把英镑和日元之间的金钱符号,换成了欧盟货币符号
- ISO8859-16 字符集
- 正式编号为ISO/IEC 8859-16:2001,又称Latin-10,这个字符集设计来涵盖阿尔巴尼亚语、克罗地亚语、匈牙利语、意大利语、波兰语、罗马尼亚语及斯洛文尼亚语等东南欧国家语言
Unicode
统一码(Unicode),也叫万国码、单一码;
世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号;
因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。而Unicode就是这样一种编码:它包含了世界上所有的符号,并且每一个符号都是独一无二的
比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字“严”
很多人都说Unicode编码,但其实Unicode是一个符号集(世界上所有符号的符号集),而不是一种新的编码方式
Unicode存在的问题
但是正因为Unicode包含了所有的字符,而有些国家的字符用一个字节便可以表示,而有些国家的字符要用多个字节才能表示出来。即产生了两个问题:
- 如果有两个字节的数据,那计算机怎么知道这两个字节是表示一个汉字呢?还是表示两个英文字母呢?
- 因为不同字符需要的存储长度不一样,那么如果Unicode规定用2个字节存储字符,那么英文字符存储时前面1个字节都是0,这就大大浪费了存储空间
正是这问题,Unicode又衍生出了这几种
UTF-8(Universal Character Set/Unicode Transformation Format)是针对Unicode的一种可变长度字符编码。它可以用来表示Unicode标准中的任何字符,而且其编码中的第一个字节仍与ASCII相容,使得原来处理ASCII字符的软件无须或只进行少部分修改后,便可继续使用
因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码
UTF-16
UTF-16UTF-16是Unicode的其中一个使用方式。即把Unicode字符集的抽象码位映射为16位长的整数(即码元)的序列,用于数据存储或传递。Unicode字符的码位,需要1个或者2个16位长的码元来表示,因此这是一个变长表示
UTF-32
UTF-32是一种将Unicode字符编码的协定,对每一个Unicode码位使用恰好32位元。其它的UTF编码则使用不定长度编码
因为UTF-32对每个字符都使用4字节,就空间而言,是非常没有效率的。以致于它们通常被认为不存在占用空间大小的讨论,使得UTF-32通常会是其它编码的二到四倍。虽然每一个码位使用固定长定的字节看似方便,它并不如其它Unicode编码使用得广泛
所以说,编码经历了很长时间才层层蜕变成利于计算机和人类生活的形式,因此里面还有许许多多的编码形式我目前还没有遇到过,我只是找了几种比较常见的编码形式,欢迎大家在评论区补充!!
附件
参考资料:百度百科_全球领先的中文百科全书
ASCII编码转换:ASCII编码转换,ASCII码在线查询工具
Comments NOTHING