一、 编码相关概念
1、 ASCII
计算机内部都是由二进制值,字符集就是用一种对应关系来表示二进制与字符的映射关系。一个字节有8个bit,2**8就可以表示256个符号,当时,20世纪60年代,美国只用低7位制定了128个字符的ASCII字符集。
2、 非ASCII
Ø 从128到255被称为扩展ASCII字符集,不是国际标准。
Ø 中文的数字量大用双字节(DBCS:double-byte character set)的方式进行表示,gb2312—gbk—gb18030
gb2313: 高字节 0xA1-0xF7 低字节 0xA1-0xFE
gbk: 高字节 0xA1-0xF7 低字节 0x00-0xFE
3、 Unicode
Ø 为了统一这种情况,将世界的所有符号都纳入其中,每个符号都有独一无二的编码,这就是Unicode。
Ø 由2个字节组成(UCS-2),后续扩展到4个字节(UCS-4)
Ø UTF-8和Unicode 的关系:UTF-8是 Unicode 的实现方式之一,用于传输和存储(节省空间)。
Ø 在传输、存储使用UTF-8变长的,在内存中使用unicode固定长的。
Ø 中文unicode编码表:http://www.chi2ko.com/tool/CJK.htm
Ø UTF-8编码规则:
1) 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。
2) 对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。
Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
----------------------+---------------------------
0000 0000-0000007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx10xxxxxx
0000 0800-0000 FFFF | 1110xxxx10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx10xxxxxx 10xxxxxx 10xxxxxx
举个栗子:
比如:张的unicode5F20 对应的二进制101111100100000
格式:1110xxxx10xxxxxx 10xxxxxx
二进制:101111100100000
UTF-8:11100101 10111100 10100000
二、 python中的编码
1、 python2
Ø python2默认的编码字符集是ASCII
Ø python2中有两种字符序列的类型:str(字符串)和unicode(Unicode字符)
Ø 编码:unicode.encode() -> bytes(str)
解码:Bytes.decode -> unicode
2、 文件编码
why:
需要对文件进行编码然后由python解释器执行
how:
指定方式:文件头# coding=<encoding name>
-*- coding: <encodingname> -*-
vim: setfileencoding=<encoding name> :
3、 python解析器/分词器的工作逻辑:
Ø 读取文件
Ø 不同的文件,根据其声明的编码去解析为Unicode
Ø 转换为UTF-8字符串
Ø 针对UTF-8字符串,去分词
Ø 编译之,创建Unicode对象
摘自:https://www.python.org/dev/peps/pep-0263/
4、 指定系统默认编码(默认是ACSII)
why:
s = '中文' # 注意这里的 str 是 str 类型的,而不是 unicode
s.encode(“utf-8”)
Python 会自动的先将 s 解码为 unicode ,然后再编码成 gb18030。因为解码是python自动进行的,我们没有指明解码方式,python 就会使用 sys.defaultencoding 指明的方式来解码。很多情况下sys.defaultencoding 是 ASCII,如果 s 不是这个类型就会出错。我的 sys.defaultencoding 是 anscii,而 s 的编码方式和文件的编码方式一致,是 utf8 的,所以出错了:
等价于 s.decode(“acsii”).encode(“utf-8”)
改成s.decode(“utf-8”).encode(“utf-8”)
how:
在文件头加入以下代码:
# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding(“utf-8”)
or
在Lib\site-packages文件夹下新建一个sitecustomize.py,内容为:
#encoding=utf8
importsys
reload(sys)
sys.setdefaultencoding('utf8')