Heim >Backend-Entwicklung >Golang >So lösen Sie den chinesischen verstümmelten Code in Golang Zip
Problem
Das mit der Go-Sprache gelieferte Zip-Paket kann Zip-Dateien dekomprimieren. Wenn Sie jedoch winr verwenden, um es in zip zu komprimieren. Wenn Sie go zum Dekomprimieren verwenden, werden Sie feststellen, dass der Dateiname verstümmelt ist. Wenn Sie es jedoch mit einer Reihe heimischer Komprimierungssoftware komprimieren und dann dekomprimieren, wird es nicht verstümmelt.
Ursache
Wenn winrar komprimiert wird, wird standardmäßig die lokale Kodierungsmethode für die Komprimierung verwendet. In China ist die lokale Kodierungsmethode im Allgemeinen GBK. Und wir wissen, dass die Zeichenfolgen der Go-Sprache im UTF-8-Format vorliegen, sodass möglicherweise verstümmelte Zeichen angezeigt werden.
Lösung
Bestimmen Sie die Codierungsmethode für den Dateinamen. Wenn es sich um GBK handelt, konvertieren Sie GBK=》utf-8
Aus dem obigen Bild wissen wir, dass, wenn das 11-Bit des Flag-Felds 1 ist, es sich um eine UTF-8-Kodierung handelt und 0 die lokale Kodierung ist.
Code
Die folgenden zwei Pakete werden im Code verwendet:
"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 }
Die chinesische PHP-Website bietet eine große Anzahl kostenloser Golang-Einführungs-Tutorials, die jeder gerne lernen kann!
Das obige ist der detaillierte Inhalt vonSo lösen Sie den chinesischen verstümmelten Code in Golang Zip. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!