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)