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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!