Go如何處理zip中的中文文件名
Go的標準庫已經自帶了zip的庫.
不過zip包在處理內部文件名時, 默認是utf8編碼的.
對于Windows中文用戶, 生成和讀取zip內部文件名默認是GBK編碼的.
因此, 在處理涉及GBK的文件名時需要做一個轉換.
Go語言官方的 go.text
子標準庫已經支持各種編碼, 下面是utf8轉GBK的函數:
import ( "code.google.com/p/go.text/encoding/simplifiedchinese" ) func utf8ToGBK(text string) (string, error) { dst := make([]byte, len(text)*2) tr := simplifiedchinese.GB18030.NewEncoder() nDst, _, err := tr.Transform(dst, []byte(text), true) if err != nil { return text, err } return string(dst[:nDst]), nil }
在生成zip文件時, 用 utf8ToGBK
處理文件名:
func main() { file, err := os.Create("中文-測試.zip") if err != nil { log.Fatal(err) } defer file.Close() wzip := zip.NewWriter(file) defer func() { if err := wzip.Close(); err != nil { log.Fatal(err) } }() // 壓縮文件 var files = []struct{ Name, Body string }{ {"11/1/readme.txt", "UTF8 字符串."}, {"11/1/readme2.txt", "This archive contains some text files."}, {"漢字/2/gopher.txt", "Gopher names:\nGeorge\nGeoffrey\nGonzo"}, {"11/中文.txt", "中文Get animal handling licence.\nWrite more examples."}, {"空目錄/", ""}, } for _, file := range files { name, _ := utf8ToGBK(file.Name) // 文件名轉換為 GBK編碼 f, err := wzip.Create(name) if err != nil { log.Fatal(err) } _, err = f.Write([]byte(file.Body)) if err != nil { log.Fatal(err) } } }
這樣就可以生成Windows下帶簡體中文的文件名壓縮文件了.
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!