ホームページ  >  記事  >  バックエンド開発  >  golang zipの中国語文字化けを解決する方法

golang zipの中国語文字化けを解決する方法

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼オリジナル
2019-12-10 10:36:534089ブラウズ

golang zipの中国語文字化けを解決する方法

#質問

Go 言語に付属の zip パッケージは zip ファイルを解凍できます。ただし、winrarを使用してzipに圧縮すると。 goで再度解凍するとファイル名が文字化けしていることがわかります。しかし、多くの国産圧縮ソフトを使って圧縮・解凍すると文字化けすることはありません。

原因

winrar を圧縮すると、デフォルトでローカル エンコード方式が圧縮に使用されます。中国では、ローカルのエンコード方式は通常 GBK です。また、Go 言語の文字列は UTF-8 形式であるため、文字化けが発生する可能性があることがわかっています。

golang zipの中国語文字化けを解決する方法

解決策

ファイル名のエンコード方法を決定し、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
}

PHP 中国語 Web サイトには、無料の

Golang 入門チュートリアル が多数あり、誰でも学ぶことができます。

以上がgolang zipの中国語文字化けを解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。