
问题
go语言自带的zip包可以解压zip文件。然而,如果你用winrar压缩成zip后。再用go去解压会发现文件名称是乱码。而当你使用一众国产压缩软件压缩后再解压却不是乱码。
原因
winrar压缩时,默认采用本地编码方式来进行压缩。在中国,本地编码方式一般是GBK。而我们知道go语言字符串都是utf-8格式的,所以有可能出现乱码的情况。

解决方案
判定文件名编码方式,如果为GBK,则转换GBK=》utf-8
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
由上面图片我们知道如果flags字段11bit位为1则是utf-8编码,0为本地编码。
代码
代码中要用到如下两个包:
"golang.org/x/text/encoding/simplifiedchinese"
"golang.org/x/text/transform"
func Unzip(zipFile string, destDir string) error {
zipReader, err := zip.OpenReader(zipFile)
if err != nil {
return err
}
defer zipReader.Close()
var decodeName string
for _, f := range zipReader.File {
if f.Flags == 0{
//如果标致位是0 则是默认的本地编码 默认为gbk
i:= bytes.NewReader([]byte(f.Name))
decoder := transform.NewReader(i, simplifiedchinese.GB18030.NewDecoder())
content,_:= ioutil.ReadAll(decoder)
decodeName = string(content)
}else{
//如果标志为是 1 <p>PHP中文网,有大量免费的<a href="https://www.php.cn/be/go/" target="_blank">Golang入门教程</a>,欢迎大家学习!</p>
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










