关于编码的问题(一)

前言

话说编码的这个问题,从大一的计算机基础课到现在大三了,再各种编程语言里几乎都遇到了乱码的问题,自己也查过好几次编码的问题,今天在python课老师留的作业里有遇到了这个问题,所以我下定决心今晚搞懂这个问题。

1.常见的编码的格式

1.1ASCII

ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)
大家知道一个字节是8位,这个编码方式只使用后7位编码,能表示0-127的范围
0~31及127(共33个)是控制字符
32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。
65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。

1.2ISO-8859-1(了解即可)

BackGround:原本的ASCII编码只能解决美国人的编码问题,无法将欧洲的文字表示出来。

于是,欧洲人就把ASCII码中没用到的第一位给用了,能表示0-255的范围

1.3Unicode

大家都知道,计算机之前一直在欧洲流行,前两种编码方式虽然解决了一定的问题。

BackGround:但是当计算机流传到亚洲的时候,比如中国,汉字博大精深,以前的编码方式根本不能满足需求了。

于是中国制定了GB2312编码。

BackGround:大家想,各国都制定自己的编码规则,那也太乱了吧。

于是Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。

下面区分一下ASCIIUnicode
ASCII编码是1个字节,而Unicode编码通常是2个字节。(如果要用到非常偏僻的字符,就需要4个字节)

1.4UTF—8

BackGround:如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。

所以,本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。

字符 ASCII Unicode UTF—8
A 01000001 00000000 01000001 01000001
不存在 01001110 00101101 11100100 10111000 10101101

看完这个表你会发现,其实UTF-8里面包括了ASCII编码了(A英文字母的编码就可以说明)
看到这,仿佛恍然大悟,怪不得平时写的code开头都会加上UTF—8,平时IDE的设置要设置成UTF—8。

Tip:
Unicode编码占内存,但速度快
UTF-8编码省空间,但是速度慢

在这里插入图片描述
本文总结参考原文