从ASCII聊起

在互联网的世界,端与端之间传递的报文都是未经过编码的字节流,每8位组成1个字节,计算机以二进制为基础,这是由于使用晶体管的开合状态表示1和0,这样8个电晶体管就可以组成一个字节,这正是应用层使用的最小单位——字节。

在通过Socket进行网络通信的程序中,假如我们在接收到报文时不知道通过什么编码才能正确解码,最好的办法就是用Socket读取字节流,在确认编码后再对这些字节流进行转码,否则产生解码错误。我们常见的编码有ASCII、GB2312、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的字节连在一起则表示汉字,而且两个字节的值都在一定的范围内。经过一轮扩展后已经基本解决汉字编码不足问题。

再后来很多国家都按自己规定给自己的文字编码,对其他国家的编码一概不认识,情况一度混乱。接着国际标准化组织推出UNICODE编码,它要把全世界所有文字符号都包括进来,使用两个字节16位对所有字符进行编码,同时为了保证兼容ASCII码,低七位仍用于表示ASCII码原来的字符。通过UNICODE确实是把世界所有字符都统一起来了。

UNICODE编码虽然统一了所有字符,但还存在一个问题,如果是英文字符其实用一个字节已经足够,但使用UNICODE却必须要搭上另外一个毫无意义的字节,在网络传输过程中则意味着要多传输一倍无用的报文。于是引入UTF-8编码,它属于UNICODE的一种实现,它是一种变长的编码方式,在UTF-8规定的实现下可以用一个字节表示ASCII码表示的所有字符,避免了多余的空间浪费。

除了上面几种常见的编码,还有很多其他编码,不同编码指定的规则也不同,但基本都对ASCII做了兼容处理,可以说ASCII是最基础的。

========广告时间========

鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 https://item.jd.com/12185360.html 进行预定。感谢各位朋友。

为什么写《Tomcat内核设计剖析》

=========================

欢迎关注:

这里写图片描述

阅读更多

扫码向博主提问

汪洋之舟---seaboat

博客专家

java深度,架构,AI,中间件,高并发
  • 擅长领域:
  • java
  • 架构
  • 中间件
  • tomcat
  • AI
去开通我的Chat快问
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangyangzhizhou/article/details/77837848
个人分类: 基础知识
上一篇TensorFlow构建循环神经网络
下一篇深度学习的seq2seq模型
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭