首頁 >後端開發 >Golang >golang zip中文亂碼怎麼解決

golang zip中文亂碼怎麼解決

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼原創
2019-12-10 10:36:534123瀏覽

golang zip中文亂碼怎麼解決

問題

go語言自帶的zip套件可以解壓縮zip檔。然而,如果你用winrar壓縮成zip後。再用go去解壓縮會發現檔案名稱是亂碼。而當你使用一眾國產壓縮軟體壓縮後再解壓縮卻不是亂碼。

原因

winrar壓縮時,預設會採用本機編碼方式來進行壓縮。在中國,本地編碼方式一般是GBK。而我們知道go語言字串都是utf-8格式的,所以有可能出現亂碼的情況。

golang zip中文亂碼怎麼解決

解決方案

判定檔案名稱編碼方式,如果為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入門教學,歡迎大家來學習!

以上是golang zip中文亂碼怎麼解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn