在互联网的世界,端与端之间传递的报文都是未通过编码的字节流,每8位组成1个字节,计算机以二进制为基础,这是因为使用晶体管的开合状态表示1和0,这样8个电晶体管就能够组成一个字节,这正是应用层使用的最小单位——字节。html
在经过Socket进行网络通讯的程序中,假如咱们在接收到报文时不知道经过什么编码才能正确解码,最好的办法就是用Socket读取字节流,在确认编码后再对这些字节流进行转码,不然产生解码错误。咱们常见的编码有ASCII、GB23十二、UNICODE、UTF-8等等,除此以外还有不少其余编码,为何会有这么多不一样的编码?网络
ASCII编码即American Standard Code for Information Interchange,做为美国标准信息交换编码,而且计算机刚开始只在美国流行,因此当时全部的计算机都使用ASCII编码,ASCII编码是由8比特组成,从0到127分别用于表示不一样的字符,包括各类符号、英语字母、阿拉伯数字等,因为128种字符只需7位便可完成编码,因此最高位被0填充。这128个字符已经彻底知足使用英语的美国人,英语单词能够经过拆分红字母后用ASCII码表示。编码
后来随着计算机的迅速发展,其余国家相继引入计算机,他们发现这些编码根本不够对他们本国文字编码,ASCII码一共8位,最多也只能表示256个字符,因而他们对最高位作文章,其中0-127已经被美国使用并成为标准,为了兼容考虑确定不能改动,剩下128-255可供使用,但很快剩下的128个编码又被用完,如今惟一能作的就是使用两个甚至更多个字节来表示一个字符,每一个国家都有本身的规定,因而中国编制了GB2312编码,为了兼容ASCII,它规定一个字节若是小于等于127则表示ASCII,若是两个大于127的字节连在一块儿则表示汉字,并且两个字节的值都在必定的范围内。通过一轮扩展后已经基本解决汉字编码不足问题。.net
再后来不少国家都按本身规定给本身的文字编码,对其余国家的编码一律不认识,状况一度混乱。接着国际标准化组织推出UNICODE编码,它要把全世界全部文字符号都包括进来,使用两个字节16位对全部字符进行编码,同时为了保证兼容ASCII码,低七位仍用于表示ASCII码原来的字符。经过UNICODE确实是把世界全部字符都统一块儿来了。设计
UNICODE编码虽然统一了全部字符,但还存在一个问题,若是是英文字符其实用一个字节已经足够,但使用UNICODE却必需要搭上另一个毫无心义的字节,在网络传输过程当中则意味着要多传输一倍无用的报文。因而引入UTF-8编码,它属于UNICODE的一种实现,它是一种变长的编码方式,在UTF-8规定的实现下能够用一个字节表示ASCII码表示的全部字符,避免了多余的空间浪费。orm
除了上面几种常见的编码,还有不少其余编码,不一样编码指定的规则也不一样,但基本都对ASCII作了兼容处理,能够说ASCII是最基础的。cdn
========广告时间========htm
鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有须要的朋友能够到 item.jd.com/12185360.ht… 进行预约。感谢各位朋友。blog
=========================
欢迎关注: