encoding与decode的含义

暂时还不太清楚


encode叫编码,通俗点就是编成我们看不懂的码,比如我们使用的utf-8来编码的,一个字符串“hello”,我们写在磁盘文件中,并不是我们想象中的这种:磁盘里存的是“hello”字符串,而是经过一层编码操作,最后落在磁盘中是以字节byte的形式存在,或者说是以二进制进行落在磁盘。有图有真相:
在这里插入图片描述

那为什么我们点开文件,看到的又是我们手写的“hello”字符串呢?
在这里插入图片描述
原因是因为在文件进行输入的时候,又进行了一步解码的操作。
decode解码,也就是我们看不懂的码(字节)解析成了“hello”字符串。


其次要说到编解码的方式,那就多了,打开IDEA,右下角有个地方,就展示了很多的编解码方式:
在这里插入图片描述
最早的编解码呢,就是ASCII码(American Standard Code for Information Interchange,美国信息交换标准编码),毕竟计算机诞生于美国。
特点:用7位(bit)表示一个字符,举个例子:1100 001 可能就表示a,1100 011 可能就表示c,所以7位其实就可以表示2的7次方个字符,也就是128个字符。
想想,英文26个字母,大小写加起来52个,再加上空格、回车、10个数字等的一些表示,加起来,128个字符其实也是用不完的,所以ASCII码在早期计算机时代,是完全可以用作存储数据的编解码格式。

但计算机传播到其他国家的时候,就发现ASCII码就有点不够用了,比如意大利啊、法国啊、俄罗斯啊这些,说的是俄文啊、罗马文等等,不同于美国那边的英文语种,所以就出现了新的编解码方式:ISO-8859-1。

这个编解码方式的特点呢就是用8位(bit)表示一个字符,也就是1个字节(byte)来表示一个字符,1byte=8bit大家都知道吧。
同理他就可以表示2的8次方,也就是256个字符,因为是从ASCII码发展过来的,所以ISO-8895-1是兼容ASCII码的,也就是字符a的表示在ISO-8895-1也是0110 0001。

不用我说,大家也知道了,计算机发展到亚洲来了,中国、日本啊等等国家,特别像咱们中国,汉字这么多,上面两种编解码方式肯定是行不通的,所以又发展出了一种新的出来:gb2312。

gb是啥,国标,很明显就是取得汉字拼音首字母,而不是取得country standard的首字母,所以他针对的是咱们中国的标准。
gb2312对所有的汉字进行了一个编码,使得汉字呢有一个特定的编码与之对应,常见的汉字就有几千个了,所以gb2312用的是2个字节来表示一个汉字。
但是gb2312对于一些生僻字没有考虑的很全面,导致在有些场景不是非常适用。

所以出现了gbk,这是对gb2312的一个扩展,将一些生僻字加入进来。但还是有些字没有全部包括进来,毕竟中华文化博大精深…
所以出现了gb18030,没完没了了…
这个是汉字最完整的表示格式,表示的汉字是最多的。

我想大家应该也知道,咱们国家的宝岛台湾用的是繁体字,所以那边用的big5,这个和上面的gb没啥关系,并不互相兼容。

除此之外,其他国家可能也有自己独特的文字体系,可能像咱们一样制定了自己的编解码体系,那就有点复杂了,日本的一个文件传到我们国家来,还得去找到对应日本的编解码格式进行查看,太不人性化了。

最好弄出一个编解码格式能够满足全球所有的文字的字符集,所以Unicode就出现了,它是最全的字符集编解码格式,采用了2个字节来表示一个字符。

那全球统一用Unicode不就可以了呗,就不存在不同语种之间编解码格式不一样的问题了,确实是这样,但是还有些头疼的问题。
对于美国而言,最开始就是用的ASCII或者ISO-9855-1的编解码格式,以前存储一个字符可能1个字节就够了,现在换成Unicode,需要2个字节来存储原来一个字节就可以存储的一个字符,但是很明显会造成空间的浪费,本来用ASCII格式来存只需要1M的空间,换成Unicode就需要2M左右的空间了。
所以Unicode不是很适合存储。

于是乎出现了UTF,Unicode Translation Format。

我们最熟知的是UTF-8,但UTF-8和前面的Unicode、gbk等等还是有区别,前面的都是编码格式,而UTF-8是存储方式,而且UTF-8是Unicode的实现方式之一。
这里可能不太好理解,比如我们想要存储’a’字符,如果我们使用UTF-8来进行编码成字节然后落到磁盘上,首先是使用Unicode进行编码:

0000 0000 0110 0001

然后存储在磁盘的时候,使用UTF-8进行存储,UTF-8有个特点,就是变长的形式进行存储(有点像mysql的varchar哈),所以最后落到磁盘上的存储格式为:

0110 0001

换句话说,UTF-8是兼容ASCII和ISO-8895-1的。

通常UTF-8存储汉字使用3个字节,有图有真相:
在这里插入图片描述
上面字符’你’乱码了?因为我解码的时候使用了ASCII码的格式,应该使用和我编码格式一样的UTF-8:
在这里插入图片描述

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值