Heim  >  Artikel  >  Backend-Entwicklung  >  So lösen Sie den chinesischen verstümmelten Code in Golang Zip

So lösen Sie den chinesischen verstümmelten Code in Golang Zip

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼Original
2019-12-10 10:36:534043Durchsuche

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.

So lösen Sie den chinesischen verstümmelten Code in Golang Zip

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Was bedeutet Golang-Typ?Nächster Artikel:Was bedeutet Golang-Typ?