fix: zip 解压改用 7z 处理中文文件名

unzip 默认按 UTF-8 解析文件名,Windows GBK/CP936 编码的 zip 包会被转义成 #Uxxxx 形式
改用 7z x 替代,自动检测文件名编码

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
耗子
2026-05-08 17:37:02 +08:00
parent 2328456a81
commit f6f22ecaf6
+4 -5
View File
@@ -75,7 +75,8 @@ func UnCompress(src string, dst string) error {
switch format {
case Zip:
_, err = shell.Execf("unzip -qo '%s' -d '%s'", src, dst)
// 用 7z 解压 zip,自动检测文件名编码,避免中文文件名变成 #Uxxxx
_, err = shell.Execf("7z x -y '%s' -o'%s'", src, dst)
case Gz:
// 单独的 gzip 文件(如 .sql.gz),解压到目标目录
// gunzip -k 保留原文件,-c 输出到标准输出,重定向到目标文件
@@ -107,16 +108,14 @@ func ListCompress(src string) ([]string, error) {
var out string
switch format {
case Zip:
out, err = shell.Execf("unzip -Z1 '%s'", src)
case Zip, SevenZip:
out, err = shell.Execf(`7z l -ba -slt '%s' | grep "^Path = " | sed 's/^Path = //'`, src)
case Gz:
// 单独的 gzip 文件只包含一个文件,返回去除 .gz 后缀的文件名
baseName := strings.TrimSuffix(filepath.Base(src), ".gz")
return []string{baseName}, nil
case TGz, Bz2, Tar, Xz:
out, err = shell.Execf("tar -tf '%s'", src)
case SevenZip:
out, err = shell.Execf(`7z l -ba -slt '%s' | grep "^Path = " | sed 's/^Path = //'`, src)
default:
return nil, errors.New("unsupported format")
}