1. 编码说明
1.1 字符集
字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等.
常用的字符集有:
- ASCII字符集
- GB2312字符集
- GBK字符集
- Unicode字符集
1.2 字符编码
是字符的编码方式,是将字符集中的字符码映射为字节流的一种具体实现方案。例如ASCII字符编码规定使用单字节中低位的7个比特去编码所有的字符。例如字母’A’的编号是65(ASCII码),用单字节表示就是0x41,因此写入存储设备的时候就是b’01000001’。常用的字符编码方式有ASCII编码、UTF-8编码、GBK编码、Big5编码等。
常用的编码方式
- ASCII
- ISO8859-1
- GB2312
- GBK
- UTF-8
1.2 总结
字符集
只是规定了每种字符所对应的二进制是什么样子的。字符编码
是将字符集对应的二进制转化为计算机可存储的二进制形式。有点类似于:原码 --> 补码的一个过程Unicode
ASCII
GB2312
是一种字符集而不是一种编码UTF-8
,GBK
等是编码方式Unicode
可用UTF-8
和GBK
等方式编码。也就是说Unicode
可以用UTF-8
编码后存在计算机上也可以用GBK
编码后存在计算机上。
注:
- 需要强调的是,ASCII便是字符集与字符编码相同的情况,直接将字符对应的8位二进制数作为最终形式存储。因此,当我们提及ASCII,既表示了一种字符集,也代表了一种字符编码,即常说的“ASCII编码”。
- Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。也即,UCS规定了怎么用多个字节表示各种文字,而怎样存储、传输这些编码,则是由UTF (UCS Transformation Format)规范规定的。UTF会在后文介绍。
2. 编码格式转换
注:Unicode包含了所有国家的字符编码,不同字符编码之间的转换都需要经过Unicode的过程
Python本身的默认编码是utf-8
2.1 Python2 与 Python3区别
Python2
s = "我是学员" #python2存储字符串默认ASCII编码存储数据
s = u"我是学员" #加一个u表示按照Unicode数据格式存储
Python3
s = "我是学员" #python3中字符串默认存储的都是Unicode格式的数据
2.2 转换编码
# 我们可以用不同编码方式编码同一个字符,最后输出的结果是不同的
s = '我是学员' # Python3默认用UTF-8编码Unicode码存在存储器里,我们现在用gbk编码存储
print('用GBK方式编码', s.encode('gbk'))
print('用UTF-8方式编码', s.encode('utf-8'))
# 输出如下:
用GBK方式编码 b'\xce\xd2\xca\xc7\xd1\xa7\xd4\xb1'
用UTF-8方式编码 b'\xe6\x88\x91\xe6\x98\xaf\xe5\xad\xa6\xe5\x91\x98'
3. 文件编码
我们大概四个地方需要用到编码:
- 操作系统默认编码方式。
- 终端编码方式。
- 程序中的字符、字符串变量的编码方式。
这种方式就是我们上面介绍到的编码格式转换 - 文本文件的编码方式。
Python源代码也是一个文本文件,Python文件的解释器在获取你的程序文件时不会按照你文件的编码方式自动识别。如果你不在文件内进行上述声明,他会自动按照UTF-8
编码方式解码去取文件。如果在这时你的文件刚好是按照GBK
的编码方式存储的,他就无法识别,会报错所以我们最好每个文件添加这个声明,并与程序文件编码方式一致。
Python文件编码声明,就涉及到这一点
# -*- coding: utf-8 -*-