#質問
Go 言語に付属の zip パッケージは zip ファイルを解凍できます。ただし、winrarを使用してzipに圧縮すると。 goで再度解凍するとファイル名が文字化けしていることがわかります。しかし、多くの国産圧縮ソフトを使って圧縮・解凍すると文字化けすることはありません。原因
winrar を圧縮すると、デフォルトでローカル エンコード方式が圧縮に使用されます。中国では、ローカルのエンコード方式は通常 GBK です。また、Go 言語の文字列は UTF-8 形式であるため、文字化けが発生する可能性があることがわかっています。解決策
ファイル名のエンコード方法を決定し、GBK の場合は GBK=》utf-8に変換します。
上の図から、フラグ フィールドの 11 ビットが 1 の場合、それは UTF-8 エンコーディングであり、0 はローカル エンコーディングであることがわかります。コード
コードでは次の 2 つのパッケージが使用されています: "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 入門チュートリアル が多数あり、誰でも学ぶことができます。
以上がgolang zipの中国語文字化けを解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。