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
相关产品推荐
相关产品推荐

