Maison  >  Article  >  développement back-end  >  golang zip code chinois tronqué

golang zip code chinois tronqué

WBOY
WBOYoriginal
2023-05-14 22:35:37739parcourir

Avec la popularité continue et l'application de Golang dans le domaine du développement Web, les fichiers compressés Zip sont devenus un module fonctionnel indispensable. Cependant, certains développeurs ont rencontré un problème courant lors de l'utilisation du package Zip de Golang pour la compression de fichiers : les noms de fichiers chinois semblent tronqués.

Il s'agit d'un problème très gênant, car non seulement il donne un aspect indescriptible au beau nom du fichier à l'origine, mais il peut également provoquer une série d'autres erreurs. Ci-dessous, nous explorerons les causes et les solutions à ce problème.

Cause du problème

Le format Zip est un format binaire qui contient le nom du fichier, le répertoire du fichier, la méthode de compression et les données compressées. Parmi ces informations, le nom du fichier est un élément très critique, car il détermine le nom et le chemin de stockage du fichier après que l'utilisateur l'a décompressé.

Cependant, différents systèmes de fichiers et formats d'encodage peuvent entraîner des résultats d'analyse différents pour le même nom de fichier. Par exemple, sur les systèmes Windows, le codage par défaut utilisé pour les noms de fichiers est GBK, tandis que sur les systèmes UNIX/Linux, les noms de fichiers utilisent UTF-8. Si nous ne gérons pas ces différentes méthodes d'encodage lors de l'utilisation du package Zip dans Golang pour la compression, le nom du fichier peut être traité comme des caractères tronqués.

Solution

Nous avons une variété de solutions au problème des noms de fichiers chinois tronqués. Ci-dessous, nous présenterons certaines des méthodes les plus réalisables.

Méthode 1 : conversion de l'encodage GB18030

Étant donné que le format Zip utilise l'encodage CP437 pour représenter le nom de fichier, nous pouvons convertir le nom de fichier de l'encodage GB18030 en encodage CP437, garantissant ainsi que le fichier peut être correctement analysé dans n'importe quel nom d'environnement. Dans Go, vous pouvez utiliser le package golang.org/x/text/encoding/simplifiedchinese pour convertir entre l'encodage GB18030 et l'encodage CP437. 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

我们还可以使用 reflect 包中的 StructTag 选项,强制使用指定的编码方式。具体可以在结构体中添加 zip 的 Tag,在 Tag 中加一个 chinese-utf8 的标签就可以了。示例代码如下:

type File struct {
    Name string `zip:"filename=测试文件,chinese-utf8"`
}

func main() {
    zhName := "测试文件"
    utf8Name, _ := GbkToUtf8([]byte(zhName))
    f := &File{Name: string(utf8Name)}
    // 压缩文件...
}

方法三:使用 fileheader 和 FileInfo 中的 name 属性

在 Golang 的 Zip 包中,我们还可以通过调用 fileheaderFileInfoname

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
}

Méthode 2 : Utiliser Reflect

Nous pouvons également utiliser l'option StructTag dans le package reflect pour forcer l'utilisation de la méthode d'encodage spécifiée. Plus précisément, vous pouvez ajouter la balise zip à la structure et ajouter une balise chinese-utf8 à la balise. L'exemple de code est le suivant :

rrreee

Méthode 3 : Utilisez l'attribut name dans fileheader et FileInfo 🎜🎜Dans le package Golang Zip, nous pouvons également appeler fileheader et FileInfo Attribut name pour spécifier manuellement l'encodage correct pour chaque fichier. 🎜rrreee🎜Conclusion🎜🎜Pour le problème des noms de fichiers chinois tronqués, le package Zip de Golang propose une variété de solutions. Si le format de codage du nom de fichier n’est pas uniforme, il est facile que le nom de fichier soit tronqué. Nous pouvons facilement éviter ce problème en choisissant simplement la bonne solution en fonction de nos besoins. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:structure golang转jsonArticle suivant:structure golang转json