Python字符串编码
字符串编码的前世今生
1. 一个字节由8个bit组成,所以1个字节能表示的最大数为255;
2. 计算机是美国人发明的,所以一个字节可以表示所有的字符了,所以ASCII就成为美国人的标准编码;
3.但是ASCII编码处理汉字是明显不够的,中文不止255个汉字,所以中国制定GB2312编码,用两个字节表示一个汉字,GB2312还把ASCII包含进去了,同理,日文。韩文等等上百个国家为了解决问题都发展了一套字节的编码,标准就越来越多,如果出现多种语言混合现实就一定会乱码;
4.这时候出现了Unicode编码,将所有的标准统一到了一套编码里面;
5.那ASCII编码和Unicode编码之间是如何进行转换的?下面是具体的转换方法:
5.1 字母A用ASCII编码表示的十进制是65,二进制即为0100 0001
5.2 汉字“中”已经超出了ASCII编码的范围,用Unicode编码十进制是20013 二进制是0100 1110 0010 1101
5.3 A字母用Unicode编码时只需要在前面补上0 即为0000 0000 0100 0001
6.乱码问题解决了,但是同时又出现了一个新的问题,如果全部是英文字母的话,Unicode编码比ASCII编码多消耗一倍的内存,同时网络传输的时候也多消耗一倍的带宽;
7.所以这个时候出现了长度可变化的utf-8的编码。
字符与字节
1byte = 8bit
1KB = 1024 bytes
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
ASCII编码: 一个英文字母占据一个字节的空间,一个中文字母占据两个字节的空间;
utf-8编码: 一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。中文标点占据三个字节,英文标点占据一个字节;
Unicode编码: 一个英文等于两个字节,一个中文(含繁体)等于两个字节。中文标点占据两个字节,英文标点占据两个字节。
Unicode编码为GB2312编码 utf-8编码 ASCII等编码的一个父级编码,那这些子编码之间子在需要相互转换的时候就需要借助父级编码Unicode。子编码是可以直接转换为父级编码,然后父级编码转换为另一种类型的子编码。
Python2和Python3字符编码存在的问题
获取默认编码格式:
>>> import sys
>>> sys.getdefaultencoding()
我们发现在python2中默认的编码格式是 'ascii' 编码,在python3中默认的编码格式为utf-8
第一步:在终端输入python进入python2的开发环境
第二步:s = "中国" # 获取s的值拿到 '\xe4\xb8\xad\xe5\x9b\xbd' 说明此时的ASCII编码无法识别汉字
Python2和Python3字符编码问题的解决方案
import sys
defaultencoding = 'utf-8'
if sys.getdefaultencoding() != defaultencoding:
reload(sys)
sys.setdefaultencoding(defaultencoding)