Question
The zip package that comes with the go language can decompress zip files. However, if you use winrar to compress it into zip. If you use go to decompress it again, you will find that the file name is garbled. But when you use a number of domestic compression software to compress and then decompress it, it will not be garbled.
Cause
When winrar is compressed, the local encoding method is used for compression by default. In China, the local encoding method is generally GBK. And we know that Go language strings are in UTF-8 format, so garbled characters may appear.
Solution
Determine the file name encoding method, if it is GBK, convert GBK=》utf-8
From the above picture, we know that if the 11 bit of the flags field is 1, it is UTF-8 encoding, and 0 is the local encoding.
Code
The following two packages are used in the code:
"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 Chinese website has a large number of free Golang introductory tutorials, everyone is welcome to learn!
The above is the detailed content of How to solve the Chinese garbled code in golang zip. For more information, please follow other related articles on the PHP Chinese website!