以'rb'模式读取图片仍触发UnicodeDecodeError的原因咨询
问题解答
嘿,我太懂你这困惑了——明明特意用了rb模式读二进制,怎么还会触发utf-8解码错误?其实问题出在你不该尝试把图片的二进制数据用utf-8解码!
为什么会报错?
图片(比如JPG、PNG这类)本质是纯二进制格式的文件,它们的字节流完全不是按照utf-8编码规则生成的文本内容。举个具体的例子:JPG文件的开头第一个字节就是0xff,这在utf-8编码规则里属于无效的起始字节,所以当你调用data.decode('utf-8')时,Python自然会抛出UnicodeDecodeError。
你用rb模式读取文件的操作是完全正确的,这一步得到的data是bytes类型的二进制数据,本身没有任何问题——错就错在后续的解码操作,二进制图片数据根本不需要被解码成字符串!
正确的处理方式
结合你正在写HTTP服务器的场景,分两种情况给出方案:
- 如果是要把图片作为HTTP响应返回给客户端:直接把
bytes类型的data发送出去就行,同时记得在响应头里设置正确的Content-Type(比如JPG设为image/jpeg,PNG设为image/png),全程不需要做任何解码操作。 - 如果是要对图片内容做处理(比如修改尺寸、提取像素信息):用专门的图片处理库来处理二进制数据,比如Pillow:
from PIL import Image import io # 把二进制数据转换成Pillow可读取的对象 img = Image.open(io.BytesIO(data)) # 接下来就可以对img进行裁剪、调色等各种操作了
总结
核心就是别把二进制数据和文本数据混为一谈!utf-8解码只适用于文本文件,图片这类二进制文件直接以bytes形式处理就好,完全不需要解码~
内容的提问来源于stack exchange,提问作者Gefen Hajaj
相关产品推荐
相关产品推荐

