如何修复UnicodeDecodeError:utf-8无法解码字节0x89的问题
解决remove.bg API返回数据UnicodeDecodeError问题
你遇到的问题核心原因很明确:remove.bg API默认返回的是处理后的图片二进制数据(比如PNG格式,文件头就是0x89),不是JSON或纯文本格式,所以用utf-8解码必然报错,直接打印只能看到二进制乱码。
下面分两种场景给出解决方案:
场景1:直接保存处理后的图片到本地
如果你的需求是获取处理好的图片文件,直接把返回的二进制数据写入文件即可,不需要解码:
修改代码末尾的print(data.decode("utf-8"))为以下代码:
# 将二进制图片数据写入本地文件 with open("processed_image.png", "wb") as img_file: img_file.write(data) print("处理后的图片已保存为 processed_image.png")
场景2:获取API响应的JSON元数据(含图片URL、错误信息等)
如果需要获取API的响应详情(比如错误提示、图片在线链接),需要在请求头中添加Accept: application/json,让API返回JSON格式的响应,而不是直接返回图片二进制:
修改代码的headers部分:
headers = { 'X-API-Key': apikey, 'Content-Type': 'application/json', 'Accept': 'application/json' # 新增这一行,指定接收JSON格式 }
处理响应数据:
替换原有的print(data.decode("utf-8"))为以下代码:
# 解码并解析JSON响应 response_data = json.loads(data.decode("utf-8")) # 格式化打印JSON内容 print(json.dumps(response_data, indent=2, ensure_ascii=False)) # 可选:从JSON中提取图片URL并下载 image_url = response_data.get("data", {}).get("image_url") if image_url: import urllib.request urllib.request.urlretrieve(image_url, "image_from_url.png") print("已通过URL下载图片到本地")
额外说明
- 当API调用成功且未指定
Accept头时,返回的是PNG/JPG等图片的二进制流,这是正常行为; - 如果调用失败(比如API密钥错误、图片无效),API会自动返回JSON格式的错误信息,此时即使没加
Accept头,用utf-8解码也不会报错,但为了统一处理建议始终添加Accept头。
内容的提问来源于stack exchange,提问作者Yulia
相关产品推荐
相关产品推荐

