python开头编码cc手_python的编码问题整理

本文详细介绍了Python中的编码和解码概念,包括ASCII、GBK、unicode和UTF-8的区别。在Python 2中,由于默认使用ASCII编码,导致在CMD中打印中文和open()文件时可能出现乱码问题。而在Python 3中,默认编码为UTF-8,乱码问题得到缓解。此外,文章还讨论了requests库在处理不同编码网页内容时的注意事项。
摘要由CSDN通过智能技术生成

一、编码和解码

1、编码(encode):将人类可以识别的语言(英文、中文等)转化成机器语言(01串)的过程,用于存储。

2、解码(decode):将机器语言转化成人类可识别的语言的过程,用于显示。

编码类型

1、ASCII编码:最早使用的编码方式

2、GBK编码:为了兼容中文,非ASCII编码

3、unicode编码:为了兼容所有语言,从ASCII扩展而来

4、utf-8编码:为了节省空间,对unicode的优化

二、py2中的string编码

ab456e80cd8a20b457e5d2e9e5cc8c5e.png

1、python2默认的是ASCII编码方式

2、unicode是真正意义上的字符串;str是字节串。

258076854c38c703fdeb183c37270070.png

3、乱码处理

1)cmd中的乱码

现象:

新建hello.py文件,内容如下

1 #coding:utf-8

2 print '果果'

在cmd中运行python hello.py

7d13b29860977aa5104d132abea93419.png

解决方法:中文前增加“u”

1 #coding=utf-8

2 print u"果果"

运行结果

1657a084c1794c3a60d6610dfd4196e6.png

原因

我们在win下的终端即cmd.exe去执行,cmd.exe本身也一个软件;当我们python2 hello.py时,python2解释器(默认ASCII编码)去按声明的utf8编码文件,而文件又是utf8保存的,所以没问题;问题出在当我们print'苑昊'时,解释器这边正常执行,也不会报错,只是print的内容会传递给cmd.exe用来显示,而在py2里这个内容就是utf8编码的字节数据,可这个软件默认的编码解码方式是GBK,所以cmd.exe用GBK的解码方式去解码utf8自然会乱码。

2)open()中的乱码

现象:

创建hello文本,保存成utf8:

我爱中国

代码如下

1 #coding=utf-8

2 f=open('hello.txt')3 print f.read()

运行结果

C:\Python27\python.exe E:/pyClass/temp/hello.py

鎴戠埍涓浗

解决:

open()中加入encoding='utf-8'关键字参数,但是open()方法没有此参数;使用codecs.open(),代码如下:

1 #coding=utf-8

2 importcodecs3 f=codecs.open('hello.txt',encoding='utf8')4 print f.read()

运行结果

C:\Python27\python.exe E:/pyClass/temp/hello.py

我爱中国

原因:

win的操作系统安装时是默认的gbk编码,当执行open函数时,调用的是操作系统打开文件,操作系统用默认的gbk编码去解码utf8的文件,自然乱码。

4、对于Python代码中避免遇到编码问题,有一些小建议:

字符编码声明:在代码开头声明编码格式

使用codecs的open函数处理文本文件

尽可能使用unicode而不是str:在所有字符串的引号前加u

三、py3的string编码

3bf7bb03b86bcbb646c41143fa4e4833.png

1、py3默认编码方式utf-8

2、str类型存unicode数据,bytse类型存bytes数据

3、乱码处理

1)cmd打印中文,不存在乱码问题

2)open()文件乱码问题,处理同py2

3)网页的编码

1 #coding=utf-8

2 importrequests3

4 res = requests.get("http://www.baidu.com")5 data =res.content6 print(data)7 print(type(data))

运行结果

"C:\Program Files\Python36\python3.exe" E:/pyClass/temp/hello.py

b'\r\n

\xe7\x99\xbe\xe5\xba\xa6\xe4\xb8\x80\xe4\xb8\x8b\xef\xbc\x8c\xe4\xbd\xa0\xe5\xb0\xb1\xe7\x9f\xa5\xe9\x81\x93 \r\n'

要正常显示的话,需要要使用decode()方法

1 #coding=utf-8

2 importrequests3

4 res = requests.get("http://www.baidu.com")5 data =res.content6 print(data.decode('utf-8'))

4、requests返回gbk乱码问题

现象:使用requests模块,发送请求,返回解码时报错

UnicodeEncodeError: 'gbk' codec can't encode character '\xab' in position 18864: illegal multibyte sequence

解决:修改python的默认编码,增加如下代码

1 #coding=utf-8

2 importio3 importsys4 importrequests5

6 sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')

原因:

win7的默认编码格式是:gbk

cmd——chcp——936

python3的默认编码格式:utf-8

>>> sys.getdefaultencoding()

'utf-8'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值