从ASCII码到UTF8,讲一讲编码

1、计算机是世界上最笨的机器,它只认识 ‘0’ 和 ‘1’;人类是世界上最聪明的动物,几千年的演进产生了无数灿烂的文化成果,最有代表性的一个就是文字,文字的产生和改进最大程度地提高人类合作的效率,提高生存能力,在优胜略汰的自然选择中成为王者;那么笨笨的计算机怎么和人类交互呢,怎么识别文字呢,答案就是编码。

2、最早计算机是老外发明的,他们的文字只有26个英文字母和一些简单特殊字符,加起来也没有超过128个,所以出现了最简单的编码方式ASCII码,用一个字节就可以表示所有的文字了,甚至都没用完(最高位bit7固定为0)。那么就简单了,人们在键盘上敲下A键,我们的键盘设备就会把这个信息向告知计算机一个A被按下了,计算机当然会做很多很复杂事情,其中一件就是在存储设备中记录下A的ASCII码,另一件就是查找字库把A这个字符在显示设备中显示出来。下一次人们再编辑这个文档时,计算机就自动去存储设备把所有的文字的ASII码取出来,再一一转换成显示设备显示哪些字符需要的数据(也就是字库里面的数据),最后在显示设备中显示出来。

3、后来计算机普及了,不同的国家都有自己的文字,ASCII这种编码方式显然不够用了(但不影响它的存在),出现了新的编码方式ANSI。这种编码方式用2个字节表示一个文字,并向下兼容ASCII码(最高位是0的就是ASCII码,是1的就是其它文字的码)。显然2个字节并不能表示所有国家的所有文字,所以它在不同国家的具体的编码方式又不一样,出现了ANSI内部不同的标准,比如在我们国家使用GB2312。所以在中国用GB2312这种方式写的一篇文章用其它编码标准去打开,就全是乱码,像一坨屎一样,比如这篇文章。

4、那怎么办呢,继续搞啊!出现了新的编码方式Unicode,它使用3个字节表示一个文字,把地球上所有文字都编码成唯一的一个值,这样就舒服了。但是又蛋疼了,三个字节,如果是老外用简直炸开,我一个字节可以表示完的东西你要用三个字节,咋的了,水(ying)费(pan)不用钱吗?聪明的人类又开始发功了,第一,虽然实际上所有语言的文字很多,但是常用的没有那么多,可以用2个字节先把常用的文字编码了;第二,你尽管使用三个字节编码,但是我存储可以通过特殊的方式节省空间。基于以上两点思想Unicode延伸出两种基本模型UTF16和UTF8。UTF16就是基于第一点思想,够用就行,实际就存储两个字节,把世界常用的文字表示出来。UTF8针对编码后实际使用的字节数的不同采用不同存储方式,比如用一个字节表示的ASCII码,实际就存储一个字节;对于使用两个字节表示的字符,比如说中国的 ‘国’ 字,Unicode编码值为0x56fd,实际存储值为0xe59bbd,实际存储时每个字节的高位表示长度信息,如图1说明。此外,UTF16又区分两种类型,UTF16-LE和UTF16-BE,只是存储两个字节的顺序不一样。UTF8也还有一种带BOM的,只是在文档头部多了几个字节表示该文档是UTF8编码。
 我是图1
                   我是图1
  至此,基本讲完了所有编码方式。联系下我们实际应用场景,我们经常用各种文档编辑工具去编写处理一些资料,有时会遇到打开一个文档看到里面有乱码的情况,这种就要考虑下是不是用错了编码方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值