python中的编码问题

415 阅读2分钟

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)

你好!我是中文