Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk menangani kod kacau Cina dalam zip golang

Bagaimana untuk menangani kod kacau Cina dalam zip golang

PHPz
PHPzasal
2023-04-24 14:47:57814semak imbas

Dengan populariti bahasa Golang, semakin ramai orang mula menggunakannya untuk membangunkan aplikasi baharu. Salah satu aplikasi biasa adalah untuk membungkus fail dari sistem fail dan memampatkannya ke dalam fail ZIP. Terutama apabila berurusan dengan nama fail Cina, adalah mudah untuk menghadapi masalah aksara yang bercelaru. Artikel ini akan membincangkan cara menyelesaikan masalah aksara Cina yang kacau dalam zip Golang.

1. Perihalan Masalah

Apabila menggunakan pakej zip Golang, jika nama fail yang diproses mengandungi aksara Cina, aksara bercelaru akan muncul apabila output ke fail ZIP. Rajah di bawah menunjukkan struktur direktori yang mengandungi nama fail Cina:

example
├── file1.txt
└── 文件2.txt

Kami menggunakan kod berikut untuk membungkusnya ke dalam fail ZIP:

package main

import (
    "archive/zip"
    "os"
    "path/filepath"
)

func main() {
    zipFileName := "example.zip"
    files := []string{"example/file1.txt", "example/文件2.txt"}

    // Create a new ZIP file.
    zipFile, err := os.Create(zipFileName)
    if err != nil {
        panic(err)
    }
    defer zipFile.Close()

    // Create a new writer to write to the ZIP file.
    zipWriter := zip.NewWriter(zipFile)
    defer zipWriter.Close()

    // Iterate over the files and add them to the ZIP file.
    for _, file := range files {
        addFileToZip(file, zipWriter)
    }
}

func addFileToZip(file string, zipWriter *zip.Writer) error {
    // Open the file to be added to the ZIP file.
    fileToZip, err := os.Open(file)
    if err != nil {
        return err
    }
    defer fileToZip.Close()

    // Get the file information for the file being added.
    fileInfo, err := fileToZip.Stat()
    if err != nil {
        return err
    }

    // Create a new file header for the file being added.
    header, err := zip.FileInfoHeader(fileInfo)
    if err != nil {
        return err
    }

    // Set the name for the file being added (this is what appears in the ZIP archive).
    header.Name = filepath.Base(file)

    // Add the file header to the ZIP archive.
    writer, err := zipWriter.CreateHeader(header)
    if err != nil {
        return err
    }

    // Copy the contents of the file into the ZIP archive.
    _, err = io.Copy(writer, fileToZip)
    if err != nil {
        return err
    }

    return nil
}

Melaksanakan program ini akan menghasilkan contoh . zip, buka fail yang dimampatkan, kita dapat melihat bahawa nama fail itu bercelaru. Seperti yang ditunjukkan dalam rajah di bawah:

Bagaimana untuk menangani kod kacau Cina dalam zip golang

Ini kerana apabila program melaksanakan zipWriter.CreateHeader (header), ia akan menggunakan pengekodan UTF-8 secara lalai untuk memproses nama fail , tetapi nama fail yang digunakan ialah pengekodan lalai sistem (GBK dalam kes saya). Oleh itu, ia menjadi kacau apabila menulis fail ZIP.

2. Penyelesaian

Untuk menyelesaikan masalah di atas, kami perlu memastikan bahawa nama fail ditukar kepada pengekodan UTF-8 sebelum menulis fail ZIP. Walau bagaimanapun, nama fail mungkin dijana menggunakan pengekodan lalai sistem, jadi kami mesti memastikan bahawa format pengekodan nama fail dikenal pasti dengan betul dan ditukar kepada pengekodan UTF-8.

Berikut ialah contoh mudah yang menunjukkan cara melaksanakan langkah di atas:

package main

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

func main() {
    zipFileName := "example.zip"
    files := []string{"example/file1.txt", "example/文件2.txt"}

    // Create a new ZIP file.
    zipFile, err := os.Create(zipFileName)
    if err != nil {
        panic(err)
    }
    defer zipFile.Close()

    // Create a new writer to write to the ZIP file.
    zipWriter := zip.NewWriter(zipFile)
    defer zipWriter.Close()

    // Iterate over the files and add them to the ZIP file.
    for _, file := range files {
        addFileToZip(file, zipWriter)
    }
}

func addFileToZip(file string, zipWriter *zip.Writer) error {
    // Open the file to be added to the ZIP file.
    fileToZip, err := os.Open(file)
    if err != nil {
        return err
    }
    defer fileToZip.Close()

    // Get the file information for the file being added.
    fileInfo, err := fileToZip.Stat()
    if err != nil {
        return err
    }

    // Create a new file header for the file being added.
    header, err := zip.FileInfoHeader(fileInfo)
    if err != nil {
        return err
    }

    // Convert the file name to UTF-8.
    header.Name, err = toUTF8(fileInfo.Name())
    if err != nil {
        return err
    }

    // Add the file header to the ZIP archive.
    writer, err := zipWriter.CreateHeader(header)
    if err != nil {
        return err
    }

    // Copy the contents of the file into the ZIP archive.
    _, err = io.Copy(writer, fileToZip)
    if err != nil {
        return err
    }

    return nil
}

func toUTF8(src string) (string, error) {
    var (
        buf bytes.Buffer
        w   = transform.NewWriter(&buf, simplifiedchinese.GBK.NewDecoder())
    )
    _, err := w.Write([]byte(src))
    if err != nil {
        return "", err
    }
    err = w.Close()
    if err != nil {
        return "", err
    }
    return buf.String(), nil
}

Dalam kod di atas, kami menggunakan pakej golang.org/x/text/transform untuk menukar nama fail daripada GBK Format ditukar kepada format UTF-8. Kami mula-mula mengimport pakej dan menukar nama fail daripada GBK kepada pengekodan UTF-8 melalui fungsi toUTF8(). Kemudian dalam fungsi addFileToZip() kami mengemas kini Header.Name dengan nama fail yang ditukar dan menambahnya pada fail ZIP.

Fail ZIP yang dijana dengan melaksanakan program ini akan mempunyai nama fail dipaparkan dalam bahasa Cina seperti biasa.

Ringkasan

Apabila menggunakan pakej zip Golang, jika terdapat nama fail Cina, anda akan menemui aksara bercelaru apabila mengeluarkan ke fail ZIP. Untuk menyelesaikan masalah ini, kita perlu menukar nama fail kepada pengekodan UTF-8 terlebih dahulu untuk mengelakkan aksara bercelaru. Dalam artikel ini, kami menggunakan pakej golang.org/x/text/transform untuk menukar nama fail daripada format GBK kepada format UTF-8. Dengan cara ini, kami boleh memastikan bahawa nama fail tidak akan bercelaru apabila menambahkannya pada fail ZIP.

Atas ialah kandungan terperinci Bagaimana untuk menangani kod kacau Cina dalam zip golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn