golang,zip,中文乱码
后端开发-Golang
大商创源码进不去后台,vscode代码不能运行,ubuntu退出直径,cmd 执行tomcat,sqlite怎么取指定数量,二次元图片爬虫软件,php 对象的类名,秦皇岛seo外包公司,免费网站采集软件下载,柱状统计图模板lzw
问题彩票源码出售出租,重启vscode保留工作区,ubuntu页面小,文件读取tomcat路径,爬虫蜘蛛图片,php 获取变量名,潍城seo优化推广价格,分类网站源码 php,书画网站模板下载lzw
go语言自带的zip包可以解压zip文件。然而,如果你用winrar压缩成zip后。再用go去解压会发现文件名称是乱码。而当你使用一众国产压缩软件压缩后再解压却不是乱码。聚合支付码支付接口源码,ubuntu北通手柄,ppt网站爬虫下载,php临时队列,地产seo推荐lzw
原因winrar压缩时,默认采用本地编码方式来进行压缩。在中国,本地编码方式一般是GBK。而我们知道go语言字符串都是utf-8格式的,所以有可能出现乱码的情况。
解决方案
判定文件名编码方式,如果为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入门教学,欢迎大家学习!