php7 zip 中文乱码,golang zip中文乱码怎么解决

2ad2ddfda8730070fe19e20eb14155b0.png

问题

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

原因

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

2ce6eb460d58d309713043f964584a40.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入门教程,欢迎大家学习!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值