Python使用zipfile解压含特殊字符的ZIP包时文件名乱码问题求助
解决Python解压ZIP包德语变音字符文件名乱码问题
问题原因
Python内置的zipfile模块默认会将ZIP包内的文件名按照cp437编码(DOS时期的老式编码)解码,若压缩时文件名使用的是utf-8/latin-1等其他编码,就会出现解码错误导致解压后文件名乱码,德语的变音符号(Umlaute)属于常见的受影响字符。
你之前的尝试没有生效,是因为zip_ref.namelist()返回的已经是错误解码后的字符串,直接对其做编码转换无法还原原始正确的文件名。
解决方案
手动修正文件名编码后单独解压文件,不要直接调用extractall,示例代码如下:
import zipfile import os save_as = "path/result.zip" dest = "/path/target/" with zipfile.ZipFile(save_as, "r") as zip_ref: for file_info in zip_ref.infolist(): # 先把错误解码的字符串用cp437转回原始字节,再用utf-8解码得到正确文件名 # 如果utf-8解码失败可以替换为'latin-1'尝试 correct_name = file_info.filename.encode('cp437').decode('utf-8') # 拼接目标路径 target_path = os.path.join(dest, correct_name) # 处理目录的情况 if file_info.is_dir(): os.makedirs(target_path, exist_ok=True) else: # 确保父目录存在 os.makedirs(os.path.dirname(target_path), exist_ok=True) # 读取文件内容写入到正确路径 with open(target_path, 'wb') as f: f.write(zip_ref.read(file_info.filename))
验证说明
从你提供的xxd输出可以看到,文件名的字节序列c3a4/c3bc/c39c完全符合UTF-8编码下德语变音字符ä/ü/Ü的编码规则,配合你系统locale为en_US.UTF-8的环境,上述代码可以正常还原文件名。
内容的提问来源于stack exchange,提问作者shadow
相关产品推荐
相关产品推荐

