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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:45:04