为什么文件的名称在golang,linux中使用archive / zip变得混乱?

时间:2014-11-15 10:43:01

标签: linux character-encoding go zip

我正在使用golang的标准包archive / zip将几个文件包装到zipfile中 这是我的测试代码:

package main

import (    
    "archive/zip"
    "log"
    "os"
)

func main() {
    archive, _ := os.Create("/tmp/测试file.zip")
    w := zip.NewWriter(archive)

    // Add some files to the archive.
    var files = []struct {
        Name, Body string
    }{
        {"测试.txt", "test content: 测试"},
        {"test.txt", "test content: test"},
    }

    for _, file := range files {
        f, err := w.Create(file.Name)
        if err != nil {
            log.Fatal(err)
        }

        _, err = f.Write([]byte(file.Body))
        if err != nil {
            log.Fatal(err)
        }
    }

    err := w.Close()
    if err != nil {
        log.Fatal(err)
    }
}

结果:
我按预期在测试file.zip下获得了一个名为/tmp的zip文件 在unzip之后,我收到两个文件:test.txtц╡ЛшпХ.txt,这就是一团糟。
两个文件中的内容都按预期正常。

为什么会发生这种情况以及如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

这可能是issue with unzip无法正确处理UTF8名称。明确使用中文语言环境对我有用:

$ LANG=zh_ZH unzip 测试file.zip
Archive:  测试file.zip
  inflating: 测试.txt              
  inflating: test.txt
$ cat *.txt
test content: testtest content: 测试

答案 1 :(得分:0)

import {
    "golang.org/x/text/encoding/simplifiedchinese"
    "golang.org/x/text/transform"
}

filename, _, err = transform.String(simplifiedchinese.GBK.NewEncoder(), "测试.txt")