从ASCII聊起

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

在互联网的世界,端与端之间传递的报文都是未经过编码的字节流,每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内核设计剖析》

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

欢迎关注:

这里写图片描述

目录
相关文章
|
3月前
|
XML Java 数据库
java实现英文转摩尔斯电码传输(一)
java实现英文转摩尔斯电码传输(一)
28 0
|
4月前
|
Rust JavaScript 前端开发
了不起的Unicode(二)
了不起的Unicode(二)
|
4月前
|
存储 JavaScript 前端开发
了不起的Unicode(一)
了不起的Unicode(一)
|
7月前
|
关系型数据库 MySQL 数据处理
位、字节、字符与字(字母跟汉字)的爱恨情仇
位、字节、字符与字(字母跟汉字)的爱恨情仇
位、字节、字符与字(字母跟汉字)的爱恨情仇
|
11月前
|
存储 编解码 自然语言处理
史诗级计算机字符编码知识分享,万字长文,一文即懂!
前一阵跟同事碰到了字符乱码的问题,了解后发现这个问题存在两年了,我们程序员每天都在跟编码打交道,但大家对字符编码都是一知半解:“天天吃猪肉却很少见过猪跑”,今天我就把它彻底讲透!
10491 3
|
Python
[oeasy]python0120_英语的崛起_英文字符_小写字母的由来_不列颠帝国
[oeasy]python0120_英语的崛起_英文字符_小写字母的由来_不列颠帝国
83 0
[oeasy]python0120_英语的崛起_英文字符_小写字母的由来_不列颠帝国
|
存储 编解码 前端开发
【编码篇】看破字符 %20 之谜,百分号编码以及其背后
提到这个 %20,想必大家都见过,熟悉一点编码的人,还会知道这玩意就是空格转换而来! 那么我们一起破解, 如何编码而来? 我们今天继续学习前端编码知识
558 0
【编码篇】看破字符 %20 之谜,百分号编码以及其背后
|
存储 Windows
一文了解ASCII、Unicode、UTF-8前生今世
我们常常在开发是出现乱码问题或者常常或多或少注意过UTF-8,这是什么东西呢。本文当你走进它们的世界。
|
存储 JavaScript 程序员
编码大揭秘:Unicode的流言终结者
如果你是一个生活在2003年的程序员,却不了解字符、字符集、编码和Unicode这些基础知识。那你可要小心了,要是被我抓到你,我会让你在潜水艇里剥六个月洋葱来惩罚你。
204 0
编码大揭秘:Unicode的流言终结者