tags: [笔记, 字符串编解码]
categories: [笔记, 字符串编解码]


在Python3中,字符串的类型为str,在内存中是以unicode编码形式表示;如果需要保存到硬盘或进行网络传输,则需把str转化为以字节为单位的bytes,是经过“可变长编码”utf-8、gbk等编码后的字符串,是一种字节码。

介绍

Python3中,默认字符串都是unicode类型,unicode是一个万能的字符集,可以存储任意的字符,但是unicode字符串只能在内存中存在,不能在磁盘和网络间传输数据,如果要在文件或者网络间传输数据,必须要将unicode转换为bytes类型的字符串,因此我们在写代码的时候有时候要对unicodebytes类型字符串进行转换,转换的函数如下:

  1. encode('utf-8'):将unicode编码成bytes类型,并且编码方式采用的是utf-8
  2. decode('utf-8'):将bytes解码成unicode类型,并且解码的方式采用的是utf-8
  3. utf-8是编码的方式,还有其他编码方式,比如gbkascii等。

    早期

    因为历史原因(计算机是美国人发明的,最早只有127个字符被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122),而Python发布的时候Unicode编码还未出生,所以在Python2版本中,默认的字符串编码采用的是ascii编码;但是要处理中文等其他国家文的字显然一个字节是不够的,因此,Unicode字符集应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。Unicode标准也在不断发展,但最常用的是UCS-16编码,用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。

    Unicode编码与ASCII编码的区别:

    ASCII编码是1个字节,而Unicode编码通常至少是2个字节。
    字母A用ASCII编码是十进制的65,二进制的01000001
    字符0用ASCII编码是十进制的48,二进制的00110000,注意字符'0'和整数0是不同的;
    汉字已经超出了ASCII编码的范围,用Unicode编码是十进制的20013,二进制的01001110 00101101
    如果把ASCII编码的A用Unicode编码,只需要在前面补0就可以,因此,A的Unicode编码是00000000 01000001

    具体编码(utf-8、gbk、latin-1、ascii……)

    新的问题又出现了:如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。
  • unicode是一个字符集,相当于一个字典,全世界所有的字符或者标点符号都对应一个数字。以后要在计算机中显示这个字符的时候,就使用unicode字符集中对应的那个数字就可以了。
  • utf-8gbklatin-1ascii都是具体的编码实现(动态编码,节省存储空间和传输流量)。 因为unicode中,将大部分的字符都用2个字节存储,但是对于英文字母,比如a,其实他只需要一个字节就够了,如果都用2个字节存储,那么比较浪费硬盘空间或者浪费流量,因此unicode并不适合用来存储。而utf-8则是unicode的一种实现方式,他默认会使用8位,也就是一个字节存储,如果存储不下了,则会动态的改变大小用来存储字符。因此utf-8比较节省空间,并且也可以包含全世界所有的字符。

    参考

    https://www.liaoxuefeng.com/wiki/1016959663602400/1017075323632896