您好,登錄后才能下訂單哦!
golang中zip解壓后中文文件名亂碼怎么辦?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
問題
go語言自帶的zip包可以解壓zip文件。然而,如果你用winrar壓縮成zip后。再用go去解壓會發(fā)現(xiàn)文件名稱是亂碼。而當你使用一眾國產壓縮軟件壓縮后再解壓卻不是亂碼。
原因
winrar壓縮時,默認采用本地編碼方式來進行壓縮。在中國,本地編碼方式一般是GBK。而我們知道go語言字符串都是utf-8格式的,所以有可能出現(xiàn)亂碼的情況。
解決方案
判定文件名編碼方式,如果為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è)資訊,感謝各位的閱讀。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。