python中的编码问题decode与encode详解

decode 与 encode详解

decode(解码)作用:将其他编码的字符串转换成unicode编码

例:str1.decode(‘gb2312’),表示将gb2312编码的字符串str1转换成unicode编码。

encode(编码)作用:将unicode编码转换成其他编码的字符串

例:str2.encode(‘utf-8’),表示将unicode编码的字符串str2转换成utf-8编码。

注意:decode和encode不加参数的时候默认参数为'utf-8

在做编码转换时,通常需要以unicode作为中间编码
,即先将其他编码的字符串解码(decode)成unicode,
再从unicode编码(encode)成另一种编码。
复制代码

爬虫中的编码注意事项

有的时候需要用到请求对象的限制,即:

urlib.request.Request(url=url,data=data,headers=headers)

其中的data参数一般是字典,那么需要进行转换:

import urllib.request
# 引入格式转换的模块
from urllib import parse

# 请求对象的限制所需数据url,headers以及data
url = 'htttp://www.baidu.com'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36',
}
data = {
    'name':'lihua',
    'age':'15'
}

# 字典类型的data不符合要求,需进行以下转换!!!
# urlencode将字典类型的data转换成URL能识别的参数类型
#    即:name=lihua&age=15
# 同时使用encode()将其转换为utf-8格式,因为请求对象的限制中的data参数为bytes类型
#    即:b'name=lihua&age=15'
data = parse.urlencode(data).encode()

# 进行请求对象的限制,赋予request
request = urlib.request.Request(url=url,data=data,headers=headers)
#模拟浏览器打开request
response = urllib.request.urlopen(request)

# 获取到的某个网页源码有可能是utf-8,gb2312等编码格式,要想在终端输出源码,则需要进行解码(decode),变成unicode编码
content = response.read().decode()
print(content)
复制代码

文件问题

1.在文件中直接写入str类型的字符,会导致乱码

string = '你好!我是中文'
fp =open('test.txt','w')
fp.write(string)
复制代码

����������

2.为了解决乱码,将str类型转换为bytes类型,在写入

string = '你好!我是中文'
# 将文件编码为utf-8格式
string_exchange = string.encode()  # <class 'bytes'>
# 参数:
#    "w" - 写入 - 打开文件进行写入,如果文件不存在则创建该文件
#    "b" - 二进制 - 二进制模式(例如图像)。
fp =open('test.txt','wb')
fp.write(string_exchange)
复制代码

你好!我是中文

3.解决乱码的另一种形式

string = '你好!我是中文' 

#open函数内置encoding,为可选参数
fp =open('test.txt','w',encoding='utf-8') 
fp.write(string)
复制代码

你好!我是中文