同事在 Windows 上用资源管理器打的包,Linux 上解出来文件名是方块和符号,7z 打开却正常。目录里一共 42 个文件,中文名全废,只能靠大小猜内容。日志里能对上时间点,这种反而好排。
Windows 打包工具按 GBK 把文件名写进 zip 头,又没有设置 UTF-8 标志位。unzip 默认按本机 locale 解释,服务器上是 UTF-8,GBK 字节就被解成了别的字。这一点先确认清楚,后面就不用反复试。
unzip -l pkg.zip | head -5 unzip -O GBK pkg.zip -d out/ 7z x -mcp=936 pkg.zip -oout2/
「zip 文件名乱码」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
别只看报错的最后一行,往上看几行,真正的起因通常在上面。
处理上按这个顺序:先看 zip 头有没有置 UTF-8 标志位 unzip -l 里带星号的表示已标记;没有标志位就用 -O GBK 指定源编码;不支持 -O 的版本换 7z x 或 bsdtar 解;解完抽查文件名和文件大小 别只看名字对就当成功。
结果对不对很好判断,out 目录里 42 个文件名全部是中文 随机打开两个内容也正常。
