编码——ASCII、UTF-8等常见编码知识扫盲

ASCII、UTF-8等常见编码知识扫盲

前言

        对于每个接触过计算机相关知识的人来说,字符编码应该多少有些了解。我现在是本科三年级,也是学习计算机的第三个年头,大概了解一些字符编码的规则。然而若要当场讲出个所以然来,我恐怕难以完成。在补自然语言处理的实验作业——文本聚类的过程中,我突然对字符编码好奇了起来。于是直接翘了作业,去查阅相关资料,好在不用花太多功夫,收获颇丰,于是在此总结。

简介

        我们知道,在计算机内部,所以信息都是以二进制编码的形式存在,1个二进制位称为1个比特(bit),可以表示2种状态,而8个比特又称为1个字节(Byte)。整体来看,无论是RAM还是ROM,都是一大堆的0、1信号。在此基础上的各种编码和解码,不过是对这些二进制串进行不同的分割以及对分割后的字串采用相应的规则进行识别。例如:在C语言中int类型数据将4个字节也就是32个比特作为一个整体识别,最高位作为符号位,剩下31个比特表示整数大小;而在float类型中,虽然也是将32个比特作为整体处理,但是其采用IEEE 754标准进行编码和解码,最高位为符号位,中间8位为指数位,后23位为尾数位;而char类型将1个字节(8个比特)进行处理,数值大小即为代码点,对照ASCII码标准查找相应字符即可。

        自计算机诞生以来,如何有效地将信息输入传递给计算机,以及如何转化计算机处理后的输出结果成人类能理解的形式,一直是值得研究和改进的问题。一开始,计算机采用最原始的打孔纸带输入输出,于是我们不得不使用最让人头疼的机器语言,然后是汇编语言与LISP等早期高级语言,之后是ALGOL等高级语言,再然后是C、Pascal等结构化编程语言,到后来的面向对象编程、和现在的静态类型和新兴语言,从代码到文本,从文本到语音,我们和计算机交互变得越来越便捷、轻松。这种趋势也是字符编码所遵循的。

这篇文章将介绍常见的字符编码标准,着重了解他们出现的动机和解决的需求,并介绍一些背景故事。计算机的知识若是只有理论,那永远只是停留在概念的理解,本文也将挑出其中具有一些有趣的点进行简单实验

        另外关于中文编码的介绍、为什么计算机硬件通常以8个比特当作1字节、如何使用Unicode私人使用区平面的实验等内容,我将放在下篇文章中进行介绍。

推荐对字符编码感兴趣的同学可以前往unicode.org官网、symbl.cc网站查阅相关信息,然后可以使用ultraedit工具查看想要编码的文档。好啦,话不多说,进入正文。

正文

一、ASCII——美国信息交换标准代码

        在20世纪50年代和60年代早期,不同的计算机制造商使用不同的字符编码方案,这直接导致了兼容性问题,使用者之间的信息传输极为不便,需要一个统一的标准来促进不同计算机系统之间的数据交换。1963年,美国国家标准协会(ANSI)的X3.2小组提出了一种使用7位二进制数表示字符,共计128个字符((包括32个不能打印出来的控制符号))。比如空格"SPACE"是32(二进制00100000),大写的字母A是65(二进制01000001)。在实际应用中考虑到了未来可能的扩展等原因,最终ASCII码在存储和处理时使用8个比特(计算机硬件通常以8个比特当作1字节为单位进行数据的存储和操作)。现在ASCII码最前面的1位统一规定为0。

        ASCII的出现提供一种标准化的字符编码方案,涵盖基本的英文字母、数字和控制字符,便于数据交换和文本处理,这给字符编码领域开创了一个成功的先例。

二、非ASCII字符编码

        ASCII在美国成功之后,其他国家也开始研究、制定本国语言的编码规则,如法国、中国等。可是有两个问题需要解决:

        一是英语用128个符号编码就足够了,但是对于很多其他语言,这是远远不够的。比如,在法语中,字母上方有注音符号,它就不止128个。至于亚洲国家的文字,符号就更多了。拿汉字来说,大约将近十万个(北京国安咨询设备公司汉字字库收入有出处汉字91251个)。为了解决这个问题,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。而亚洲国家的文字符号普遍较多,一个字节256远远不够,必须使用多个字节表达一个符号。比如,简体中文常见的编码方式是在1980年由中国国家标准总局提出并发布的GB2312(中华人民共和国国家标准汉字信息交换码,没错,就是你写word要用的那个字体格式),使用两个字节表示一个汉字,所以理论上最多可以表示256x256=65536个符号。并且在1980年代,由日本和中国等国家的计算机制造商和标准化组织提出和开发了DBCS(Double Byte Character Set),用来提供一种混合使用单字节和双字节编码的方案,以表示东亚语言中的大量字符。

        二是虽然每个国家内的兼容性问题可以通过本国内的标准解决,但是不同国家之间依旧不兼容。哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号。但是不管怎样,所有这些编码方式中,0--127表示的符号是一样的,128--255的这一段却不一样。说明他们均对ASCII码兼容,但是互相不兼容。这个问题的解决就要引出今天的重点介绍的一种编码标准:Unicode。

三、Unicode

        世界上存在着多种编码方式,这就意味着同一个二进制数字可以被解码成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。为什么电子邮件常常出现乱码?为什么一个文件用其他软件打开容易出现乱码?就是因为发信人和收信人使用的编码方式不一样,文件和不对应的软件编码方式通常也不一样。随着互联网的普及,不同国家之间的数据交换越来越常见,很多需要服务多个国家的个人和公司不得不保存对应国家所采用的编码工具并记住他的编码方式以便保证不出现乱码。可以想象,如果有一种编码标准,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字所表示的,每个符号都有其独一无二的代码点。

        1991年,由包括微软、苹果、IBM 等组成的 Unicode 联盟提出和开发的一种能够表示全球所有语言的所有字符&#x

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值