溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

golang中zip解壓后中文文件名亂碼怎么辦

發(fā)布時間:2020-06-18 10:39:05 來源:億速云 閱讀:1385 作者:Leah 欄目:編程語言

golang中zip解壓后中文文件名亂碼怎么辦?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。    

問題

go語言自帶的zip包可以解壓zip文件。然而,如果你用winrar壓縮成zip后。再用go去解壓會發(fā)現(xiàn)文件名稱是亂碼。而當你使用一眾國產壓縮軟件壓縮后再解壓卻不是亂碼。

原因

winrar壓縮時,默認采用本地編碼方式來進行壓縮。在中國,本地編碼方式一般是GBK。而我們知道go語言字符串都是utf-8格式的,所以有可能出現(xiàn)亂碼的情況。

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
}

以上就是golang中zip解壓后中文文件名亂碼的解決方法,看完之后是否有所收獲呢?如果想了解更多相關內容,歡迎關注億速云行業(yè)資訊,感謝各位的閱讀。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI