You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从含Unicode字符的HTTP载荷中提取并保存图片?

问题核心分析

你碰到的问题根源是误将原始二进制字节流解码成了Unicode字符串,而非拿到的是base64编码数据。JPEG是纯二进制格式,HTTP请求体里的原始JPEG数据是字节形式,若被当作文本(比如默认UTF-8)解码成字符串,就会出现ÿØÿà这类字符——这些是二进制字节被错误解码后的表现,根本不是base64编码内容。

解决方案

一、正确保存从请求体获取的JPEG数据

1. 还原错误解码的字符串为原始字节

如果已经拿到了错误解码后的Unicode字符串,用latin-1编码还原原始字节(latin-1是单字节编码,每个Unicode字符对应一个字节,能无损恢复被错误解码的二进制数据):

# 你从请求体拿到的Unicode字符串示例
data_str = "ÿØÿà�JFIF������ÿâØICC_PROFILE���È����0��mntrRGB XYZ ..."

# 还原为原始二进制字节
jpeg_bytes = data_str.encode('latin-1')

# 保存为正常图片
with open('image.jpg', 'wb') as f:
    f.write(jpeg_bytes)

2. 直接从HTTP请求体读取字节(推荐)

如果是自己处理HTTP请求,别把请求体解码成字符串,直接读取字节流:

# 以requests库为例
import requests

response = requests.get('目标图片接口URL')
# 直接获取响应的二进制字节
jpeg_bytes = response.content

with open('image.jpg', 'wb') as f:
    f.write(jpeg_bytes)

二、实现图片与该字符串格式的互转

1. 本地图片转目标字符串格式

把JPEG图片转成你拿到的那种Unicode字符串(本质是二进制字节用latin-1解码):

with open('image.jpg', 'rb') as f:
    jpeg_bytes = f.read()

# 将字节解码为latin-1字符串,得到你需要的格式
data_str = jpeg_bytes.decode('latin-1')

2. 字符串转图片

就是前面的还原步骤,用latin-1编码转回字节后保存:

jpeg_bytes = data_str.encode('latin-1')
with open('restored_image.jpg', 'wb') as f:
    f.write(jpeg_bytes)
为什么之前的方法失效?

你之前误以为数据是base64编码,直接拼接data:image/jpeg;charset=UTF-8;base64,前缀,但base64编码只会包含A-Z、a-z、0-9、+、/这些字符,你的数据里有ÿØà这类非base64字符,显然不符合格式,所以用urllib处理后得到的是损坏文件。

内容的提问来源于stack exchange,提问作者Monsta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 18:30:09