如何解码piexif中含明文与字节字符的元数据字符串?
问题解答
''.join(c for c in weird_string if c.isprintable()) 无法保证得到MakerNote字段的正确人类可读形式,原因如下:
- MakerNote的厂商自定义结构:不同相机厂商的MakerNote是自定义二进制格式,并非纯字符串。比如尼康、佳能的MakerNote包含偏移量、厂商私有标识字节等结构信息,直接按字符串读取会把这些二进制字节解析成无意义的乱码字符,
isprintable()会保留这类无效可打印字符。 isprintable()的局限性:该方法会保留厂商自定义的特殊占位符、编码错误导致的乱码(比如用错误编码解析UTF-16文本产生的怪字符),同时无法区分有效可读文本和无效可打印符号。此外,它会直接保留空格,但你需要的是替换空格、制表符为合适控制字符,这一步逻辑完全缺失。- 编码不匹配问题:MakerNote的文本部分可能使用厂商特定编码(如Shift-JIS、UTF-16LE),如果piexif默认解码时用了错误编码,得到的
weird_string本身就是乱码,后续过滤自然无法得到正确结果。
改进方案
- 优先用piexif解析结构化MakerNote:通过
piexif.load(image_path)加载Exif数据后,提取'Exif'下的piexif.ExifIFD.MakerNote,再根据厂商标识(如Exif中的Make字段)调用对应解析逻辑,避免直接当成字符串处理。 - 明确编码后解码:先通过相机品牌确定MakerNote的编码,将原始字节流用正确编码解码为字符串,再进行过滤。
- 自定义字符过滤与替换:
- 用正则匹配有效可读字符范围,比如保留中英文、数字和常用符号:
import re filtered = re.sub(r'[^\x20-\x7E\u4E00-\u9FA5]', '', weird_string) - 单独处理空格、制表符的替换,比如把制表符换成换行、多个空格合并为单个:
processed = filtered.replace('\t', '\n').replace(' ', ' ')
- 用正则匹配有效可读字符范围,比如保留中英文、数字和常用符号:
内容的提问来源于stack exchange,提问作者Luca Clissa
相关产品推荐
相关产品推荐

