• 技术文章 >后端开发 >Golang

    golang zip中文乱码怎么解决

    爱喝马黛茶的安东尼爱喝马黛茶的安东尼2019-12-10 10:36:53原创2360

    php入门到就业线上直播课:进入学习

    问题

    go语言自带的zip包可以解压zip文件。然而,如果你用winrar压缩成zip后。再用go去解压会发现文件名称是乱码。而当你使用一众国产压缩软件压缩后再解压却不是乱码。

    原因

    winrar压缩时,默认采用本地编码方式来进行压缩。在中国,本地编码方式一般是GBK。而我们知道go语言字符串都是utf-8格式的,所以有可能出现乱码的情况。

    8d337e97c6b29150190700dc46d842d.png

    解决方案

    判定文件名编码方式,如果为GBK,则转换GBK=》utf-8

    由上面图片我们知道如果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 << 11也就是 2048  则是utf-8编码
                decodeName = f.Name
            }
            fpath := filepath.Join(destDir, decodeName)
            if f.FileInfo().IsDir() {
                os.MkdirAll(fpath, os.ModePerm)
            } else {
                if err = os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil {
                    return err
                }
                inFile, err := f.Open()
                if err != nil {
                    return err
                }
                defer inFile.Close()
                outFile, err := os.OpenFile(fpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
                if err != nil {
                    return err
                }
                defer outFile.Close()
                _, err = io.Copy(outFile, inFile)
                if err != nil {
                    return err
                }
            }
        }
        return nil
    }

    PHP中文网,有大量免费的Golang入门教程,欢迎大家学习!

    以上就是golang zip中文乱码怎么解决的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐:golang zip 中文乱码
    上一篇:golang type什么意思 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• golang读取文本乱码解决方法• cmd执行golang乱码解决方法• golang中的错误处理方法• golang中创建错误的方法
    1/1

    PHP中文网