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

Ubuntu下Python解压俄语文件名Zip包乱码问题求助

解决俄语文件名Zip包解压乱码问题

问题根源

网站打包多文件时,Zip内部的俄语文件名使用了Windows-1251(CP1251)编码,但未遵循Zip标准的UTF-8标记规范。Linux/Ubuntu默认用UTF-8解析Zip文件名,导致乱码;Windows手动解压时自动识别CP1251编码,所以正常。解压后再转码会因为字节已被错误解析而失效,必须在解压阶段指定正确编码。

解决方案

1. Python脚本解压时指定编码

直接在zipfile.ZipFile初始化时指定encoding='cp1251',确保读取文件名时用正确编码:

import zipfile

# 替换为你的Zip文件路径和解压目录
with zipfile.ZipFile("downloaded_files.zip", "r", encoding="cp1251") as zip_ref:
    zip_ref.extractall("./extracted_files")

如果不确定编码,可通过chardet库自动检测:

import zipfile
import chardet

with zipfile.ZipFile("downloaded_files.zip", "r") as zip_ref:
    # 提取第一个非目录文件的原始文件名字节
    for entry in zip_ref.infolist():
        if not entry.is_dir():
            raw_filename = entry.filename.encode("raw_unicode_escape")
            detected = chardet.detect(raw_filename)
            target_encoding = detected["encoding"]
            break

# 用检测到的编码重新解压
with zipfile.ZipFile("downloaded_files.zip", "r", encoding=target_encoding) as zip_ref:
    zip_ref.extractall("./extracted_files")

2. Ubuntu手动解压指定编码

使用unzip命令的-O参数指定Zip内部文件名编码:

unzip -O CP1251 downloaded_files.zip -d ./extracted_files

如果CP1251无效,可尝试俄语的另一种常见编码KOI8-R:

unzip -O KOI8-R downloaded_files.zip -d ./extracted_files

3. 确保系统支持俄语字符

Ubuntu下需确保locale支持UTF-8(默认已支持),若仍显示异常,可安装俄语语言包:

sudo apt install language-pack-ru

临时设置locale为俄语UTF-8:

export LC_ALL=ru_RU.UTF-8

注意事项

  • 不要在解压后再用convmv转码:因为解压时用错误编码解析的文件名,字节已经被不可逆地破坏,转码无法恢复原始俄语字符。
  • 单独下载文件正常是因为浏览器会处理HTTP响应头中的编码信息,自动转换为正确的UTF-8文件名;而Zip包内的文件名没有编码标记,需要手动指定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 13:10:03