Go如何處理zip中的中文文件名

jopen 10年前發布 | 17K 次閱讀 Go語言 Google Go/Golang開發

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