Python中关于“中文乱码”的问题,现规整以下,并统一回答python
同窗问:
jacky:我在爬取XX网站信息的时候,中文怎么老是显示的乱码?
jacky:UTF-8与GBK究竟是个啥?
jacky:我用的是Mac系统,网上说Python3中默认的编码是UTF-8,可我显示中文时怎么仍是乱码?数据库
计算机只认二进制的“0”和“1”svg
这个世界的规则就是谁发起,谁定规则。计算机是美国人发明的,在开发计算机的时候,美国人只考虑到了英文的兼容性,并无考虑包括中文在内的其余语言。函数
英语构成计算机最底层的元素就是:26个英语字母,加上特殊字符,加上数字。网站
(1)发明计算机时,字符编码使用的是ascii码,包括Python2默认的字符编码就是ascii码(Python3默认使用的是UTF-8,详见下文);编码
(2)ascii码为1字节(8位)url
8位二进制(例如:01010101)有多少种排列组合?
对于英文来讲,8位二进制足够用了,全部python2还默认ascii码也不足为奇。code
- 全球化和科技共享,让计算机的开发者认识到,要开发一种各国语言都能兼容的编码,就有了unicode,也叫万国码。
(1)unicode 包含各国全部的语言文件和符号,对于中文来讲,8位已经不够用了,unicode规定:一个中文汉字最少用3个字节来表示。orm
(2)Python中能够用bin函数将十进制转化为二进制
bin(82)
'0b1010010' #b表示的R是二进制
(3)万国码的弊端
占内存和硬盘
针对unicode的弊端,现在的开发者,又对unicode进行了精简,开发了UTF-8编码
(4)特别说明(读完下文在回来看,就好理解了)
- UTF-8编码是对unicode 的一个再加工
- 对unicode 的编码进行了划分和整理,用8位的就划分为用8位的,不额外在用空间
- 规则:
- 英文:8位
- 欧洲:16位
- 中文:24位
- 特别说明:在Unicode编码方式下,才存在 utf-8,utf-16,utf-32的编码方式,这句话对于解释下文的解码与编码特别重要
UTF-8 | GBK(@数据分析-jacky) |
---|---|
外国人开发 | 中国人开发 |
外国人看不会乱码 | 外国人看会乱码 |
一个汉字占3个字节 | 一个汉字占2个字节 |
编码:将字符转化为二进制字节的过程
解码:将二进制字节转化为字符的过程
字符串在Python内部的表示是Unicode编码。
所以在作编码转换时,一般须要以Unicode做为中间编码,即先将其余编码的字符串解码(decode)成Unicode,再从Unicode编码(encode)成另外一种编码。
decode的做用是将其余编码的字符串转换成Unicode编码,如str1.decode(‘gbk’),表示将gbk编码的字符串str1转换成Unicode编码;
encode的做用是将Unicode编码转换成其余编码的字符串,如str2.encode(‘UTF-8’),表示将Unicode编码的字符串str2转换成UTF-8编码所以,使用Python转码的时候必定要先搞明白,字符串str是什么编码,而后decode成Unicode,而后再encode成其余编码。
特别注意:
若是一个字符串已是unicode了,再进行解码则将出错,所以一般要对其编码方式是否为unicode进行判断:
用非unicode编码形式的string来encode也会报错
python编码有两种数据模型来支持字符串类型 :
- 一种是str ;
- 一种是unicode
代码的实现方式:
decode()->unicode->encode转化为须要的格式
实战案例:
content为从文件中读取的gbk编码的内容,咱们经过以上方法输出该内容。
content.decode('gbk').encode('utf-8')
做为数据分析(挖掘)师,python与数据库的关联是最多见的,咱们用python链接数据库后,将数据写到数据库里的中文有时会是乱码
解决办法是在python文件中加上这样几句话:
conn.set_character_set('utf8')
cur.execute('SET CHARACTER SET utf8')
cur.execute('SET character_set_connection=utf8')