Python3字符编码

通常情况下,我们在编写Python代码时在文件的前几行中添加下面一行代码用于向Python解释器标记该文件使用的编码方式

#-*- coding:utf-8 -*- # 也可采用下面的写法 # coding:utf-8

一、Python编码
??Unicode是一套统一了所有语言编码的编码,它使得不同国家的语言能够统一地显示出来而不会乱码。在早期的时候,世界上只有ASCII码用来表示英文字母和数字,但是它不能表示其他的语言字符,所以各国就使用了自己的一套字符集。为了发展和交流,国际上就研发了Unicode编码来应对这种情况。
??一般来说,在Windows系统的cmd命令行下使用的是gbk编码,而Unix系统家族则使用的是utf8编码,因此在命令行进行输入和输出汉字的时候就有可能会出现乱码的情况。
??由于历史版本问题,Python2默认使用的是ASCII编码,而Python3默认使用的是UTF-8编码。如果Python源码文件使用的编码是GBK编码,那么Python解释器在对代码进行解码操作时将会报错。

Python3字符编码
文章图片
python代码编码参考https://www.cnblogs.com/zhangqigao/p/6496172.html
二、文件读取时的编码问题
# -*- coding: utf-8 -*- with open('./test.txt', 'r') as tf: print(tf.readline())

??test.txt是utf8编码的文件,在windows命令行下进行文件内容输出的时候,由于读取的内容是utf8编码,而windows命令行是gbk编码,因此Python解释器会报下面这个错误:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 8: illegal multibyte sequence
??这是因为读取的文本没有转换为Unicode编码的原因造成的。为了便于后续代码编写,可以直接这样写:
open(filename, 'r', encoding='utf-8')

??这样写在读取文件内容并保存在字符串变量时,字符串已经转为Unicode编码,在进行其他操作时不需要再进行编码转换。对于部分需要转码的字符串变量则可以使用decodeencode函数,decode函数先将指定的编码解码为Unicode编码,然后再编码为指定的编码。
注:decode()函数也可以用来把字节转换为字符串
tf.readline().decode('utf-8').encode('gbk')

??由于GBK编码是所有中文字符编码集的总集,所以在进行中文字符编码的解码时都可以使用 decode('gbk')的方式来进行解码操作。
??Python代码中直接创建的字符串变量默认使用的是Unicode编码,因此在写入文件的时候不需要再进行编码转换操作。如果需要直接以Unicode码形式保存,可以这样写encode('unicode-escape')。类似的,在对Unicode码进行解码时,可以这样写:str.encode('utf-8').decode('unicode-escape')
三、网页爬取时的编码问题
【Python3字符编码】??由于不同网站面向的用户不同,有的网站使用的是UTF-8编码,所以爬虫在爬取网页内容时不需要额外的转码操作。而有的网站使用的是gb2312编码,这个时候就需要转码之后才能对网页中的中文字符进行处理。在url请求返回内容比较多时如请求文件等形式的链接时使用chardet进行检测可能会出现较长时间的卡顿,所以对于文件请求的url建议不要进行编码设置。
# -*- coding: utf-8 -*- import requests import chardetres = requests.get("http://www.qq.com/") res.encoding = chardet.detect(res.content)['encoding'] print(res.text)

??由于response.content获取的是byte型数据,需要使用str函数进行转化,即:
str(res.content,encoding='utf-8')

??而response.text获取的是字符串型的数据,但可能会出现乱码。可以调用chardet模块来获取网页的编码方式,并将response的编码方式设置为获取到的编码方式,在调用的时候response.text就能正常显示不会乱码了。

    推荐阅读