解码和编码
- 计算机中存储的信息都是二进制的
- 编码/解码本质上是一种映射(对应关系),比如‘a’用ascii编码则是65,计算机中存储的就是00110101
- 编码:真实字符与二进制串的对应关系,真实字符→二进制串
- 解码:二进制串与真实字符的对应关系,二进制串→真实字符
ASCII & UTF-8
- ASCII以1字节8个bit位表示一个字符,首位全是0
- unicode编码系统是为表达任意语言而设计的,为了防止存储上的冗余(比如,对应ascii码的部分),其采用了变长编码,但变长编码给解码带来了困难,无法判断是几个字节表示一个字符
- UTF-8是针对unicode变长编码设计的一种前缀吗,根据前缀可判断是几个字节表示一个字符
最佳实践
- 创建一个工程之后先确认该工程的字符编码是否已经设置为UTF-8
- 为了兼容Python2和Python3,在代码头部声明字符编码:-- coding:utf-8 --
示例
#!/usr/bin/env python
# -*- coding:utf-8 -*-
a = '你好'
b = u'你好'
c = '你好'.encode('gbk')
print(type(a), len(a))
print(type(b), len(b))
print(type(c), len(c))
输出结果:
<class 'str'> 2
<class 'str'> 2
<class 'bytes'> 4
Python3
-
Python3中定义的字符串默认就是unicode,因此不需要先解码,可以直接编码成新的字符编码
#!/usr/bin/env python # -*- coding:utf-8 -*- utf_8_a = '我爱中国' gbk_a = utf_8_a.encode('gbk') ## gbk_a = utf_8_a.decode('utf-8').encode('gbk') print(gbk_a.decode('gbk')) 输出结果: 我爱中国