Web 開発分野での Golang の人気と応用が続くにつれ、Zip 圧縮ファイルは不可欠な機能モジュールになりました。ただし、一部の開発者は、ファイル圧縮に Golang の Zip パッケージを使用するときに、中国語のファイル名が文字化けして表示されるという一般的な問題に遭遇しました。
これは非常にやっかいな問題です。本来美しいファイル名が目立たなくなるだけでなく、さまざまなエラーが発生する可能性もあります。以下では、この問題の原因と解決策を見ていきます。
Zip 形式は、ファイル名、ファイル ディレクトリ、圧縮方法、圧縮データが含まれるバイナリ形式です。この情報の中でもファイル名は、ユーザーがファイルを解凍した後のファイルの名前と保存パスを決定するため、非常に重要な部分です。
ただし、ファイル システムやエンコード形式が異なると、同じファイル名でも解析結果が異なる場合があります。たとえば、Windows システムでは、ファイル名に使用されるデフォルトのエンコードは GBK ですが、UNIX/Linux システムでは、ファイル名に UTF-8 が使用されます。 Golang で Zip パッケージを圧縮に使用する場合、これらの異なるエンコード方法を処理しないと、ファイル名が文字化けとして扱われる可能性があります。
中国語のファイル名が文字化けする問題に対して、さまざまな解決策を用意しています。以下に、より実現可能な方法をいくつか紹介します。
Zip 形式はファイル名を表すために CP437 エンコードを使用するため、ファイル名を GB18030 エンコードから CP437 エンコードに変換して、ファイルが確実に名前はどの環境でも正しく解析できます。 Go では、golang.org/x/text/encoding/simplifiedchinese
パッケージを使用して、GB18030 エンコードと CP437 エンコードの間で変換できます。
import ( "golang.org/x/text/encoding/simplifiedchinese" "golang.org/x/text/transform" ) func GbkToUtf8(data []byte) ([]byte, error) { return transform.NewReader(bytes.NewReader(data), simplifiedchinese.GB18030.NewDecoder()).ReadAll() } func Utf8ToGbk(data []byte) ([]byte, error) { return transform.NewReader(bytes.NewReader(data), simplifiedchinese.GB18030.NewEncoder()).ReadAll() }
reflect
パッケージの StructTag
オプションを使用して、指定されたエンコード方式の使用を強制することもできます。 。具体的には、構造に zip
タグを追加し、タグに chinese-utf8
タグを追加します。サンプル コードは次のとおりです。
type File struct { Name string `zip:"filename=测试文件,chinese-utf8"` } func main() { zhName := "测试文件" utf8Name, _ := GbkToUtf8([]byte(zhName)) f := &File{Name: string(utf8Name)} // 压缩文件... }
Golang Zip パッケージでは、fileheader
および # を呼び出すこともできます。 #FileInfo の
#name 属性を使用して、各ファイルの正しいエンコードを手動で指定します。
import "archive/zip" func zipFiles(filePaths []string, dest string) error { // 创建文件 newZipFile, err := os.Create(dest) if err != nil { return err } defer newZipFile.Close() // 创建 ZIP writer 对象 zipWriter := zip.NewWriter(newZipFile) defer zipWriter.Close() // 遍历 filePaths,为每个文件设置正确的编码方式 for _, filePath := range filePaths { zipFile, err := os.Open(filePath) if err != nil { return err } defer zipFile.Close() // 解析文件名,并转换编码 zipFileInfo, _ := zip.FileInfoHeader(zipFile.Stat()) zipFileInfo.Name, _ = GbkToUtf8([]byte(zipFileInfo.Name)) // 创建 Zip 文件写入器 zipWriterNewFile, err := zipWriter.CreateHeader(zipFileInfo) if err != nil { return err } // 读取文件并写入 Zip 文件中 _, err = io.Copy(zipWriterNewFile, zipFile) if err != nil { return err } } return nil }
以上がgolang zip 中国語の文字化けコードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。