Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

Linux unzip 中文檔名亂碼終極解決方案:四種實戰方法對比

編輯:Linux 系統常見問題解答

問題根源

ZIP 格式早期無編碼標準,Windows 風格 ZIP 多用 GBK/CP936 編碼檔名,Linux 預設 UTF-8 解碼,導致中文檔名變亂碼或解壓失敗。

方法一:Python 腳本精準解碼(通用性最強)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# uzip.py
import os, sys, zipfile

zip_path = sys.argv[1]
print(f"Processing: {zip_path}")

with zipfile.ZipFile(zip_path, 'r') as zf:
    for name in zf.namelist():
        try:
            # 嘗試 GBK 解碼(中文 Windows 主流)
            utf8_name = name.encode('cp437').decode('gbk')
        except UnicodeDecodeError:
            # 回退 UTF-8
            utf8_name = name

        print(f"Extracting: {utf8_name}")
        dir_name = os.path.dirname(utf8_name)
        if dir_name and not os.path.exists(dir_name):
            os.makedirs(dir_name, exist_ok=True)

        data = zf.read(name)
        if not os.path.exists(utf8_name):
            with open(utf8_name, 'wb') as f:
                f.write(data)

print("Done.")

使用:chmod +x uzip.py && ./uzip.py xxx.zip

優點:跨平台、自動建立目錄、可擴展支援更多編碼。缺點:需 Python 環境。

方法二:unzip 參數 -O 指定編碼(最快、原生)

unzip -O CP936 xxx.zip    # GBK/GB18030 別名
# 或
unzip -O GBK xxx.zip

注意:man unzip 未記錄 -O 參數,但 unzip --help 顯示 -O CHARSET。部分舊版 unzip 不支援,需更新套件。

方法三:環境變數永久生效(一次配置,終身受益)

# /etc/environment 或 ~/.bashrc
export UNZIP="-O CP936"
export ZIPINFO="-O CP936"

重新登入後,所有 unzip、zipinfo 自動使用 CP936 解碼。

方法四:Java jar 指令跨平台解壓(無編碼煩惱)

jar xvf xxx.zip

JDK 自帶 jar 工具內建處理 ZIP 編碼,通常能正確還原中文檔名,無額外參數。

方法對比總結

方法適用場景優點缺點
Python 腳本批次處理、編碼不確定、需自定邏輯彈性最高、可遞迴修正需 Python、速度較慢
unzip -O單檔快速解壓、確知編碼原生、無依賴、速度快舊版不支援、參數未文檔化
環境變數長期使用、團隊統一標準一次設定、全域生效影響所有 unzip 行為、可能誤傷 UTF-8 ZIP
jar xvf已安裝 JDK、臨時救援跨平台、免配置需 JDK、非標準解壓工具

進階:檢測 ZIP 實際編碼

# 使用 file 指令查看(僅供參考)
file xxx.zip

# Python 快速探測
python3 -c "
import zipfile, sys
zf = zipfile.ZipFile(sys.argv[1])
for n in zf.namelist()[:5]:
    try:
        print(n.encode('cp437').decode('gbk'))
    except:
        print(n.encode('cp437').decode('utf-8', 'replace'))
" xxx.zip

建議最佳實踐

  1. 日常操作:配置環境變數 UNZIP="-O CP936"
  2. 遇到失敗:改用 unzip -O GBK 或 jar xvf
  3. 批次/自動化:內嵌 Python 腳本,支援多編碼嘗試
  4. 打包端:建議使用 zip -r -utf8(Info-ZIP 3.1+)生成 UTF-8 編碼 ZIP,源頭消除亂碼
Copyright © Windows教程網 All Rights Reserved