ホームページ  >  記事  >  バックエンド開発  >  GolangのZIPコードが文字化けする

GolangのZIPコードが文字化けする

王林
王林オリジナル
2023-05-27 13:46:39674ブラウズ

ファイル圧縮に Golang を使用すると、圧縮ファイル名が文字化けする問題が発生する可能性があります。この問題の原因は、Golang の Zip ライブラリがファイルを圧縮するときに中国語の文字を適切に処理できないことです。

一般に、中国語の文字はコンピュータでは Unicode 文字エンコーディングで保存されます。 Zip 形式のファイルがファイル名を保存する場合、「CP437」と呼ばれるエンコード方式 (Windows では「MS-DOS」エンコードとも呼ばれます) が使用されます。このエンコード方式は少数の文字セットのみをサポートします。中国語の文字は含まれません。 , そのため、Zip圧縮ファイルに漢字が含まれていると文字化けが発生します。

この問題を解決するには、ファイルを圧縮するときにファイル名を Unicode エンコードから CP437 エンコードに変換する必要があります。 Golang には、UTF-8 でエンコードされた文字列を GBK エンコードに変換できる組み込み関数 golang.org/x/text/encoding/simplifiedchinese.GBK が用意されています。

次は、ファイルの圧縮時に GBK エンコードを使用できるサンプル コードです:

package main

import (
    "archive/zip"
    "fmt"
    "io"
    "os"
    "path/filepath"
    "golang.org/x/text/encoding/simplifiedchinese"
)

func main() {
    fmt.Println("Starting the application...")
    inputDir := "input_dir"
    outputFile := "output.zip"
    err := Zip(inputDir, outputFile)
    if err != nil {
        panic(err)
    }
    fmt.Println("Output file created successfully!")
}

// Zip function compress a folder to zip file
func Zip(source, target string) error {
    targetfile, err := os.Create(target)
    if err != nil {
        return err
    }
    defer targetfile.Close()

    zipWriter := zip.NewWriter(targetfile)
    defer zipWriter.Close()

    filepath.Walk(source, func(path string, info os.FileInfo, err error) error {
        if info.IsDir() {
            return nil
        }
        if err != nil {
            return err
        }

        filename := info.Name()
        gbkFilename, err := simplifiedchinese.GBK.NewEncoder().String(filename)
        if err != nil {
            return err
        }

        file, err := os.Open(path)
        if err != nil {
            return err
        }

        defer file.Close()

        zipfile, err := zipWriter.Create(gbkFilename)
        if err != nil {
            return err
        }

        _, err = io.Copy(zipfile, file)
        if err != nil {
            return err
        }
        return nil
    })

    return nil
}

上記のコードでは、filepath.Walk メソッドを使用してフォルダーを走査しました。すべてのファイルは、GBK.NewEncoder().String() メソッドを使用して、ファイル名を UTF-8 エンコードから GBK エンコードに変換します。次に、変換されたファイル名を使用して、zipWriter.Create メソッドで Zip ファイル エントリを作成します。

上記のコード例では、簡体字中国語のエンコードを使用していますが、繁体字中国語のエンコードやその他のエンコード方法を使用する必要がある場合は、対応するエンコード方法を変更してください。

概要

Golang で Zip ファイルを圧縮すると、ファイル名が文字化けする問題が発生することがあります。この問題を解決するには、ファイルの圧縮時にファイル名を Unicode エンコードから Zip ファイルで使用されるエンコードに変換する必要があります。上記のサンプル コードは、GBK エンコーディングを使用して、Zip ファイル名が文字化けする問題を解決する方法を示しています。

以上がGolangのZIPコードが文字化けするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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