解码字符触发UnicodeDecodeError,请求排查Python代码问题
问题分析与解决方案
你的代码触发UnicodeDecodeError的核心原因是逐块解码utf-8字节流的方式错误。
utf-8是多字节编码,一个字符可能占用1到4个字节。当你通过for i in response按chunk读取字节并单独对每个chunk调用decode('utf-8')时,很容易出现某个chunk的末尾刚好截断了一个多字节字符的情况——比如你遇到的0xd0,它是utf-8中西里尔字母等字符的第一个字节,后面还需要跟另一个字节才能组成完整的字符,单独解码这个不完整的字节序列自然会触发解码错误。
正确的处理方式有这几种:
最简单的方式:直接用
response.text
Requests库已经内置了完善的编码处理逻辑,会自动根据响应头的Content-Type推断编码,帮你完成解码工作:response = requests.post('LINK-TO-API', headers=headers, data=data) result = response.text手动获取全部字节后再解码
如果需要明确指定编码(比如响应头没正确标识编码),可以先获取完整的字节内容,再一次性解码:response = requests.post('LINK-TO-API', headers=headers, data=data) result = response.content.decode('utf-8')如果必须流式处理(大响应)
如果你因为响应太大需要流式读取,那应该先把所有字节块拼接成完整的字节序列,再统一解码,而不是逐块解码:response = requests.post('LINK-TO-API', headers=headers, data=data, stream=True) byte_data = b'' for chunk in response.iter_content(chunk_size=1024): byte_data += chunk result = byte_data.decode('utf-8')
这样就能避免因为截断多字节字符导致的解码错误啦。
内容的提问来源于stack exchange,提问作者streetCoder3127917
相关产品推荐
相关产品推荐

