计算机 底层都是二级制01组成的机器语言,我们屏幕上显示的字符等在计算机底层中也只是一串01代码而已,那么计算机怎么识别不同的字符呢,这就需要一个映射规则,哪个字符对应哪个01串。
ascii是由美国牛逼的XXX制定的规则,只制定了128个字母数字和符号的编码,一个字节。
但是这是美国的,为了显示汉字,我们国家制定了GBXXX标准,但是有那么多国家,这个国家用一个标准,那个国家用一个标准,就会产生混乱。
最后大家共同用Unicode,Unicode通常是两个字节,之前ascii编码的数字字母现在在Unicode中变成了两个字节,这样在大多是英文的传输中就会造成存储和传输浪费。
所以出现了可变长编码UTF-8,UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间
UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作,因为英文字母在ascii中是一个字节,在utf-8中也是一个字节,而ascii不支持中文。
从上到下分别为GBK,unicode和utf编码,其中需要注意的是无法从GBK直接转化为utf-8,可以吧Unicode字符串encode("utf-8")到UTF8,可以把Utf-8字符串decode("utf-8")到Unicode字符串
注意
encode主要是把unicode encode到utf-8,decode主要是从utf-8到unicode,windows内核都是unicode
python在print时,会自动把字符串encode为sys.stdout.encoding,当python把一个已经encode的字符串再进行encode会报错