十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
golang中zip解壓后中文文件名亂碼怎么辦?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
成都創(chuàng)新互聯(lián)公司長期為上1000+客戶提供的網(wǎng)站建設服務,團隊從業(yè)經(jīng)驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為安次企業(yè)提供專業(yè)的成都網(wǎng)站制作、成都做網(wǎng)站,安次網(wǎng)站改版等技術服務。擁有10多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
問題
go語言自帶的zip包可以解壓zip文件。然而,如果你用winrar壓縮成zip后。再用go去解壓會發(fā)現(xiàn)文件名稱是亂碼。而當你使用一眾國產(chǎn)壓縮軟件壓縮后再解壓卻不是亂碼。
原因
winrar壓縮時,默認采用本地編碼方式來進行壓縮。在中國,本地編碼方式一般是GBK。而我們知道go語言字符串都是utf-8格式的,所以有可能出現(xiàn)亂碼的情況。

解決方案
判定文件名編碼方式,如果為GBK,則轉(zhuǎn)換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解壓后中文文件名亂碼的解決方法,看完之后是否有所收獲呢?如果想了解更多相關內(nèi)容,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊,感謝各位的閱讀。